jtwc 发表于 2023-9-30 09:34

c++如何查找队列波峰波谷(波峰波谷的差值>4)?

各位老师,c++如何查找队列波峰波谷,从左到右第一个到最后1个都算,(加一个阈值A=4,波峰波谷的差值>4)?查找了很多案例,加阈值A=4后,出来结果都不正确?那位老师有正确的方法?谢谢了,下面是源码,出来的值有问题#include <iostream>
#include <vector>

class Solution
{
public:
        void findPeakValley(const std::vector<int> &nums, int &peakValue, int &valleyValue, int A)
        {
                int cur = 0, pre = 0;
                for (int i = 1; i < nums.size(); i++)
                {
                        int cur = nums - nums;
                        if (cur > 0 && pre <= 0 && nums <= valleyValue + A)
                        {
                                valleyValue = nums;
                        }
                        else if (cur < 0 && pre >= 0 && nums >= peakValue - A)
                        {
                                peakValue = nums;
                        }
                        pre = cur;
                }
                // 处理最后一个元素
                if (nums.size() >= 2)
                {
                        if (nums > nums && nums >= peakValue - A)
                        {
                                peakValue = nums;
                        }
                        else if (nums < nums && nums <= valleyValue + A)
                        {
                                valleyValue = nums;
                        }
                }
        }
};

int main()
{
        std::vector<int> nums = { 1, 17, 13, 5, 10, 15, 11, 16, 8, 11, 9, 14 };
        Solution solution;
        int peakValue = 0;
        int valleyValue = 0;
        int A = 5; // 限制值
        solution.findPeakValley(nums, peakValue, valleyValue, A);

        if (peakValue != 0)
        {
                std::cout << "最后一个波峰值为: " << peakValue << std::endl;
        }
        else
        {
                std::cout << "未找到波峰" << std::endl;
        }

        if (valleyValue != 0)
        {
                std::cout << "最后一个波谷值为: " << valleyValue << std::endl;
        }
        else
        {
                std::cout << "未找到波谷" << std::endl;
        }
        system("pause");
        return 0;
}

绵绵青山 发表于 2023-9-30 11:23

对nums排个序,取出最大最小值,若二者的差大于A,即为波峰波谷值,否则,不存在波峰波谷值,是这个理解么

jtwc 发表于 2023-9-30 11:30

绵绵青山 发表于 2023-9-30 11:23
对nums排个序,取出最大最小值,若二者的差大于A,即为波峰波谷值,否则,不存在波峰波谷值,是这个理解么
老师,下面图中的排列

绵绵青山 发表于 2023-9-30 11:50

jtwc 发表于 2023-9-30 11:30
老师,下面图中的排列

不是很明白,你预期的结果是什么

jtwc 发表于 2023-9-30 11:57

绵绵青山 发表于 2023-9-30 11:50
不是很明白,你预期的结果是什么

波峰波谷的差值>4,只要数字大于前1个波谷+4就是波峰,几个取最大的,只要数字小于前1个波峰-4就是波谷,几个取最小的,最后1个数参加选取

绵绵青山 发表于 2023-9-30 12:11

我想问的是,就你提供的nums而言,你的代码结果波峰是14,波谷是9,你期望的波峰是哪个,波谷是哪个

jamesAbc 发表于 2023-9-30 12:26

这个题二分查找是最高效的方法

jtwc 发表于 2023-9-30 12:29

jamesAbc 发表于 2023-9-30 12:26
这个题二分查找是最高效的方法

关键是出来的结果要正确才行
页: [1]
查看完整版本: c++如何查找队列波峰波谷(波峰波谷的差值>4)?