最长连续子序列:对于一个长度为 N 的数组,输出其连续的子序列及其起止位置,并且找出长度最长的那个子序列,输出其长度。

如一个数组 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;
}`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值