如一个数组 1 2 3 0 1 2 7 -1 -2 -1 0 1
输出:1 2 3 起 1 止 3; 0 1 2 起 4 止 6; -2 -1 0 1 起 9 止 12;
最长连续子序列为:-2 -1 0 1,长度为:4.
//先简单说一下这个题目的思路: //题目是说要找到每一个连续的子序列,也就是符合后一项比前一项大1,或者后后一项比前一项大2所以我们必须找到每一个连续子序列的起始位置和末位置
#include <iostream>
using namespace std;
#define N 12
int main() {
int a[N] = { 1, 2, 3, 0, 1, 2, 7, -1, -2, -1,0,1 };
int i, j, max=0, y,x, k;
i = 0; //定义一个初始位置的值赋给i
while(i < N) { //对i进行外层循环
for (j = i; j < N; j++) {
if (a[j] != a[i] + j - i) { //判断条件,因为在内层循环i值不变,相当于在判定第二项比第一项大1,第三项比第一项大2
break;
}
}
if (j - i > 1) { //末项减初始项必须要大于1,因为一个连续数列必须至少要有两个元素
for (k = i; k < j; k++) { // i为每个连续序列的初始值,j为末尾值,输出每个连续序列
cout << a[k] << " ";
}
cout <<" ; "<< "起 " << i + 1 << " 止 " << j << endl;
if (max < j - i) { //判断最长的连续子序列
max = j - i; // 最长子序列的长度
y = i ; //最长子序列的初位置
x = j; //最长子序列的末位置
}
}
**i = j; 、//把前一个连续子序列的末尾值赋给下一个连续子序列的初始值**
}
cout << "最长的子序列为:";
for (i = y; i < x; i++) {
cout << a[i] << " ";
}
cout << ",长度为:" << max << endl;
return 0;
}`