首页 > 解决方案 > C ++程序查找增加的峰值数量

问题描述

问题--- 峰值定义为序列 A=a1,a2,..ai-1,ai,ai+1..an,如果 ai-1 < ai > ai+1 即它是局部最大值,找到增加峰的数量,其中增加的峰是大于所有先前峰的峰。

我的方法 --- 找到数组中的所有局部峰值并将它们推送到向量。通过迭代该向量来查找增加的峰值的数量。

问题 - 代码在运行时显示bad_alloc () 错误

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
    int n, i,t, count,x;
    cout << "Enter No of Elements";
    cin >> n;
    int arr[n];
    for (i = 0; i < n;i++)
    {
        cin >> arr[i];
    }
    vector<int> max;
    max.reserve(n);
    if (arr[1]<arr[0]){
        t = arr[0];
        max.push_back(t);
        count = 1;
    }
    for (i = 1; i+1<n;i=i++){
        if(arr[i]>arr[i-1]&&arr[i]>arr[i+1])
            t = arr[i];
            max.push_back(t);

    }
    if(arr[n-1]>arr[n-2]){
        t = arr[n - 1];
        max.push_back(t);
    }
    for (i = 1; i < max.size();i++)
    {
        if (max[i]>max[i-1])
            count++;
    }
    cout << count;
    cin >> x;
    return 0;
}

标签: c++algorithmvector

解决方案


首先,请参阅为什么我不应该#include <bits/stdc++.h>?.

其次,数组必须有一个常数值。他们无法从任何类型的输入等中获得价值。

第三,你有一个无限循环:

for (i = 1; i+1<n;i=i++){
        if(arr[i]>arr[i-1]&&arr[i]>arr[i+1])
            t = arr[i];
            max.push_back(t);

    }

当我们进入for循环时,我们从i1 开始,(例如,n将是 3)n从 3 开始。我们看到一切顺利,当我们比较时 1+1 小于 2,所以我们继续。接下来,我们将增量发布i为 2,但是,由于发布增量返回增量 i之前的值,我们重置i为 1!(这实际上是未定义的行为,但在你的情况下,你得到了这个无限循环。)哦,这不是我们的意思,所以我们将此代码修复为:

for (i = 1; i + 1 < n; i++) {
    if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
        t = arr[i];
    max.push_back(t);

} 

增量/减量已经修改了 int 的值,这就是我们不需要分配它的原因。最后,我们必须修复这个错误:

if (arr[1] < arr[0]) {
    t = arr[0];
    max.push_back(t);
    count = 1;
}

这有点棘手,但用户可能会输入一个像 0 这样的数字,这会导致它发生故障,同时欺骗new操作员。为了解决这个问题,我们可以通过替换来防止这种情况:

cin>>n;

和:

while (cin >> n && n < 1);

当 n 小于 1 时将读入 n;

另外,我使用它的原因new是因为它是用于动态分配或可变大小数组的。这分配它:

int* arr = new int[n];

这将释放它:

delete[] arr;

有关更多信息,请阅读指针。最后结果:

#include <string>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, i, t, count, x;
    count = 0;
    cout << "Enter No of Elements";
    while (cin >> n && n < 1);
    int* arr = new int[n];
    for (i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    vector<int> max;
    max.reserve(n);
    if (arr[1] < arr[0]) {
        t = arr[0];
        max.push_back(t);
        count = 1;
    }
    for (i = 1; i + 1 < n; i++) {
        if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
            t = arr[i];
        max.push_back(t);

    }
    if (arr[n - 1] > arr[n - 2]) {
        t = arr[n - 1];
        max.push_back(t);
    }
    for (i = 1; i < max.size(); i++)
    {
        if (max[i] > max[i - 1])
            count++;
    }
    cout << count;
    cin >> x;
    return 0;
}

另外,我初始化count了 ,因为它只是在if.

注意:引用@user4581301

注意这里使用 new 。 std::vector当您需要动态数组时更喜欢。std::vector 使用 RAII 自动分配和解除分配,因此您可以确保没有泄漏。


推荐阅读