C++:最长算术子数组

C++ : Longest Arithmetic Subarray

本文关键字:数组 C++      更新时间:2024-04-27

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

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

这是代码:


#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;
}

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

例如:

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

您需要一个嵌套的循环结构(当前拥有的for循环中的for循环(来实现这一点,因为您希望用整个数组而不仅仅是下一个元素来检查某个cd

如果你需要找到一个子序列/子数组,因为元素必须彼此相邻,那么你的程序就会正常工作。

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

这里的问题是每次更新后都要重置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;
}

更多美学注意事项:

  • array是C++中用于声明std::array的关键字。尽管该程序可能仍在运行,但它可能会造成不必要的混乱。

  • int array[n]是一个VLA(可变长度阵列(。这不是一个C++标准。它可能工作,也可能不工作,这取决于编译器。

  • 为什么";使用命名空间std"被认为是不好的做法?