如何在 C++ 中找出最长的永久序列(增加或减少)?

how to cout the longest permanent sequence (increasing or decreasing) in c++?

本文关键字:增加 C++      更新时间:2023-10-16

我必须制作一个程序,C++可以选择管理从 2 到 1000 元素的序列。最后,程序必须找出最长的递增或递减序列的元素数量。

例子:

6;1;2;3;2;4;1;输出:3;(因为:1;2;3 是最长的,有 3 个元素(

6;4;3;1;5;2;1;输出:4;(因为:6;4;3;1 是最长的,有 4 个元素(

我厌倦了下面的代码和工作方式。问题是它不能给出最长的,它每次都给出最后一个序列的数量。

不幸的是,我找不到错误或问题。有人可以帮忙吗?

int counting = 1;
int counting_max = 0, counting_min = 0;
for (int i = 1; i < n; ++i) {
if(block[i] < block[i+1]) {
if(block[i]-block[i-1]>0) {
counting++;
if(counting>counting_max) {
counting_max = counting;
}}
else {
counting = 1;
}
}
if(block[i] > block[i+1]) {
if(block[i]-block[i-1]<0) {
counting++;
if(counting>counting_min) {
counting_min = counting;
}}
else {
counting = 1;
}
}
}
if(counting_max >= counting_min) {
cout<< counting_max;
}
else {
cout<< counting_min;
}

return 0;}

在我的代码中,我没有分享第一部分,因为我想它工作正常。 第一个只是一段时间,函数调用元素编号和块中的确切数字之后。 所以在我的代码中,块包含数字。

在您发布的代码中,外部循环创建了block数组的越界访问,因为您正在循环中访问block[i+1]。这可能是您的代码在一个方向上而不是在另一个方向上产生正确答案的原因。

除此之外,使用此方法还可能遇到其他一些问题:

  • 如果最终您采用最大的计数器,您可能不需要跟踪两个单独的计数器。您可以只跟踪最大的序列,无论它是增加还是减少。
  • 由于您测试数组中三个元素之间的关系以查看序列是否在增加/减少,因此当列表的元素少于三个时,您必须添加额外的逻辑来处理。
  • 您需要注意相同的数字何时重复,因为这可能不会算作增加或减少。

以下是涵盖以下几点的修订版本:

int counting = std::min(n, 1);
int counting_max = counting;
for (int i = 0; i < n - 1; ++i) {
if (
block[i] < block[i + 1] &&
(counting < 2 || block[i] > block[i - 1])
) {
counting++;
} else if (
block[i] > block[i + 1] &&
(counting < 2 || block[i] < block[i - 1])
) {
counting++;
} else if (block[i] == block[i + 1]) {
counting = 1;
} else {
counting = 2;
}
if (counting > counting_max) {
counting_max = counting;
}
}
cout << counting_max << "n";

试试这个替代代码:counting_max找到最长的升序,counting_min找到最长的降序(通过递减其循环计数器(,最后,我们比较它们以找到最终最长的序列(假设我们有 n-1 个元素,如果没有相应地更改它(

for (int i=1,j=n-2; i<n && j>=0; ++i,--j) {
if (block[i] - block[i - 1]>0) {
counting++;
if (counting>counting_max)
counting_max = counting;
}
else
counting = 1;
if (block[j] - block[j + 1]>0) {
counting_back++;
if (counting_back>counting_min)
counting_min = counting_back;
}
else
counting_back = 1;
}
if (counting_max >= counting_min)
cout << counting_max;
else
cout << counting_min;