首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++求算法的极值点

C++求算法的极值点
EN

Stack Overflow用户
提问于 2021-05-30 12:01:25
回答 1查看 250关注 0票数 1

问题:让A是n个元素的数组(即A的元素是A,.,−1)。如果以下条件适用于Ai,则元素Ai是极端的

  • Ai不是A的第一个也不是最后一个元素,即0 Ai+1或Ai−1 > Ai < Ai+1。例如,数组0、5、3、6、8、7、15、9的极值点是5、3、8、7、15。

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

我所做的是:

代码语言:javascript
运行
复制
#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;
    }
}

问题是:

我成功地编写了打印给定数组的端点的算法。

有谁能帮我做这件事吗

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

EN

回答 1

Stack Overflow用户

发布于 2021-05-30 12:38:45

首先,这个函数

代码语言:javascript
运行
复制
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

这个函数可以写成

代码语言:javascript
运行
复制
bool extremePoint( int num, int  eftNeighbour, int rightNeighbour )
{
    return leftNeighbour < num && rightNeighbour < num ||
           num < leftNeighbour && num < rightNeighbour;
}

如果序列不包含极值点,这并不意味着序列被排序。

例如,考虑序列

代码语言:javascript
运行
复制
1, 2, 2, 1

另一方面,很明显,排序序列实际上没有一个极端点。

注意这句话

编写了一种算法,用于打印给定数组的端点。

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

我将用如下方式编写这样的算法,如下面的演示程序所示

代码语言:javascript
运行
复制
#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;
}

程序输出是

代码语言:javascript
运行
复制
5, 3, 8, 7, 15, 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67760895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档