【问题标题】:C++ finding the extreme points of an algorithmC++ 查找算法的极值点
【发布时间】:2021-08-18 00:02:52
【问题描述】:

问题: 设A为n个元素的数组(即A的元素为A[0], ..., A[n-1])。如果以下关于 A[i] 的条件成立,则元素 A[i] 是极端的:

  • A[i] 不是 A 的第一个也不是最后一个元素。也就是说,0 A[i+1] 或 A [i-1] > A[i]

编写一个算法来打印给定数组的极值点。如果没有极值点,算法会打印“SORTED”。你是否同意一个数组没有极值点当且仅当它被排序?解释你的答案。

我做了什么:

#include <iostream>
using namespace std;

bool extremePoint(int arr[], int n, int num, int leftNeighbour, int rightNeighbour);

int main()
{
    int array[] = { 0, 5, 3, 6, 8, 7, 15, 9 };
    int size = sizeof(array) / sizeof(array[0]);

    for (int i = 1; i < size - 1; i++) {

        // If the current element is a peak 
        if (extremePoint(array, size, array[i], array[i - 1], array[i + 1]))
        {
            cout << array[i] << " ";
        }
    }

    return 0;
}

bool extremePoint(int arr[], int size, int num, int leftNeighbour, int rightNeighbour)
{
    if (num > leftNeighbour && num > rightNeighbour)
    {
        return true;
    }

    if (num < leftNeighbour && num < rightNeighbour)
    {
        return true;
    }
    else
    {
        return false;
    }
}

问题:

我已经编写了打印给定数组极值点的算法。

谁能帮我完成这部分:

如果没有极值点,算法会打印“SORTED”。你是否同意一个数组没有极值点当且仅当它被排序?解释你的答案。

【问题讨论】:

  • 但是您没有尝试同意或不同意该主张,也没有提供任何理由来捍卫您的立场。所以我们不知道你在这个简单的问题上遇到了什么问题。
  • 如果数组已排序,则没有元素有两个相邻的相邻元素,它们都高于或低于该元素。相反,如果一个元素有两个相邻的相邻元素,它们要么更高要么更低,则数组是未排序的。
  • @Willow Hill 如果没有极值点,则并不意味着序列已排序。例如,考虑以下序列 1、2、2、1。

标签: c++ arrays algorithm sorting


【解决方案1】:

对于初学者来说这个功能

bool extremePoint(int arr[], int size, int num, int leftNeighbour, int rightNeighbour)
{
    if (num > leftNeighbour && num > rightNeighbour)
    {
        return true;
    }

    if (num < leftNeighbour && num < rightNeighbour)
    {
        return true;
    }
    else
    {
        return false;
    }
}

不使用其参数arrsize

函数可以写成这样

bool extremePoint( int num, int  eftNeighbour, int rightNeighbour )
{
    return leftNeighbour < num && rightNeighbour < num ||
           num < leftNeighbour && num < rightNeighbour;
}

如果一个序列不包含极值点,并不意味着该序列已排序。

例如,考虑序列

1, 2, 2, 1

另一方面,很明显有序序列确实没有极值点。

注意这句话

编写一个算法,打印给定数组的极值点。

可以解释为需要编写一个单独的函数(算法)。

我会按照下面的演示程序所示的方式编写这样的算法

#include <iostream>
#include <iterator>

template <typename InputIterator, typename OutputIterator>
OutputIterator extreme_points( InputIterator first, 
                               InputIterator last,
                               OutputIterator out )
{
    if ( first != last )
    {
        for ( auto prev_value = *first++; first != last; )
        {
            auto current_value = *first;
            if ( ++first != last )
            {
                if ( prev_value < current_value && *first < current_value ||
                     current_value < prev_value && current_value < *first )
                {
                    *out++ = current_value;
                }
                
                prev_value = current_value;
            }
        }
    }
    
    return out;
}

int main() 
{
    int a[] = { 0, 5, 3, 6, 8, 7, 15, 9 };

    extreme_points( std::begin( a ), 
                    std::end( a ), 
                    std::ostream_iterator<int>( std::cout, ", " ) );
                    
    std::cout << '\n';
    
    
    return 0;
}

程序输出是

5, 3, 8, 7, 15, 

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多