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

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

我必须用 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;}

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

试试这个替代代码: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;

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

除此之外,您可能还会遇到一些其他问题:

  • 如果最后您取了最大的,您可能不需要跟踪两个单独的计数器。你可以只跟踪最大的序列,不管它是增加还是减少。
  • 由于您测试数组中三个元素之间的关系以查看序列是否 increasing/decreasing,因此当列表少于三个元素时,您将不得不添加额外的逻辑来处理。
  • 您需要注意相同数字何时重复出现,因为这可能不算增加或减少。

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

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";