c++ - 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;
}
解决方案
首先,请参阅为什么我不应该#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
循环时,我们从i
1 开始,(例如,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 自动分配和解除分配,因此您可以确保没有泄漏。
推荐阅读
- python - 使用 Python 的 open() 函数读取二进制文件时,只读取文件的一部分
- python - 使用 python 多处理从 mongodb 读取和删除
- python - 比较二维 numpy 数组的元素
- ios - 快速查找两个 MLMultiArrays 之间的距离
- react-native - 如何解决 webpack 中的“node modules styled-components is not a function”?
- python - 如何在 oct2py 中将 func_args 赋予 feval?(视窗)
- javascript - 对父组件的异步函数调用
- elasticsearch - Elasticsearch 中的“ngram”过滤器和“ngram”分词器之间是否存在性能差异
- tensorflow - 在没有总和的情况下在张量流中查找梯度
- algorithm - 间隔调度 - 每个项目的几个间隔