【问题标题】:C++ : Longest Arithmetic SubarrayC++:最长算术子数组
【发布时间】:2021-12-31 06:41:42
【问题描述】:

给定一个输入数组,输出必须是给定数组的最长算术子数组的长度。

我得到的输出不同于所需的输出。我不明白我哪里出错了,我还是个初学者,所以请忽略菜鸟的错误,并在我出错的地方帮助我。提前致谢。

代码如下:


#include <iostream>

using namespace std;

int main () {
    int n;
    cin>>n;
    int array[n];
    for (int i=0;i<n;i++)
  {
        cin>>array[i];
    }
    
    int length = 2;
    int cd = array[1] - array[0];
    for(int i=2; i<n; i++){
        if(array[i] - array[i-1] == cd){
            length++;
        }
        else {
            cd = array[i] - array[i-1];
            length=2;
        }
        cout<<length<<" ";
    }
    return 0;
}

【问题讨论】:

  • 为什么要在 for 循环中打印长度?
  • 另外,您应该保持最大长度。每次到达 else 语句时都会重置它。

标签: c++ arrays


【解决方案1】:

如果您正在寻找子序列,那么您所做的将无法实现。

For example:

Input: nums = [9,4,7,2,10]
Output: 3
Explanation: 
The longest arithmetic subsequence is [4,7,10].

您需要一个嵌套循环结构(您当前拥有的 for 循环中的一个 for 循环)来完成此操作,因为您想检查某个 cd 与整个数组,而不仅仅是下一个元素。

如果考虑到元素必须彼此相邻,您需要找到子序列/子数组,那么您的程序将正常工作。

您的代码中还有一个大错误是您在 for 循环中打印了长度。不确定这是否是出于调试目的。

【讨论】:

    【解决方案2】:

    这里的问题是您在每次更新后重置length。您需要一个变量来存储每个length 的最大值。

    #include <iostream>
    using namespace std;
    
    const int maxn = 1e6;
    int arr[maxn];
    
    int main ()
    {
        int n; cin>>n;
        for (int i=0;i<n;i++) { cin >> arr[i]; }
    
        int length = 2;
        int maxLength = 2; //max variable
        int cd = arr[1] - arr[0];
        for(int i=2; i<n; i++){
            if(arr[i] - arr[i-1] == cd) {length++;}
            else {
                cd = arr[i] - arr[i-1];
                length=2;
            }
            //cout<<length<<" "; //remove this
            maxLength = max(maxLength, length); //update maxLength
        }
        cout << maxLength;
    }
    

    更多美学说明:

    【讨论】:

    • 非常感谢,这有帮助
    • @Sreekar 如果是这样,您能否将答案标记为正确?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2012-01-24
    • 2017-08-26
    • 2010-09-11
    • 2023-01-30
    • 2011-07-08
    • 2021-07-19
    相关资源
    最近更新 更多