牛客算法-最長連續子序列
參考:
https://blog.csdn.net/weixin_33701251/article/details/88749584
題目描述
牛牛現在有一個n個數組成的數列,牛牛現在想取一個連續的子序列,並且這個子序列還必須得滿足:最多隻改變個數,就可以使得這個連續的子序列是一個嚴格 上升的子序列,牛牛想知道這個連續子序列最長的長度是多少。
輸入描述:
輸入包括兩行,第一行包括一個整數n(1 ≤ n ≤ 10^5), 即數列的長度:第二行n個整數a_ i,表示數列中的每個數(1<= a_i<= 10^9),以空格分割。
輸出描述:
輸出一個整數,表示最長的長度。
思路:通過一個遞增數組和一個遞減數組,進行是否連續判斷
#include <iostream>
using namespace std;
int main()
{
int number;
cout << "請輸入數組長度:";
cin >> number;
if(number==0){
return 0;
}
int arr[number],left[number]={1},right[number],ans=0;
right[number-1]={1};
for(int index=0;index<number;index++){
scanf("%d",&arr[index]);
}
for(int index=1;index<number;index++){ //從左向右遞增加一
if(arr[index]>arr[index-1]){
left[index]=left[index-1]+1;
}else{
left[index]=1;
}
}
for(int index=number-1;index>=0;index--){ //從右向左遞減加一
if(arr[index-1]<arr[index]){
right[index-1]=right[index]+1;
}else{
right[index-1]=1;
}
}
for(int index=1;index<number-1;index++){
if(arr[index-1]<arr[index+1]-1){ //相隔的兩個數大小相差2則可以連接
int sum=left[index-1]+right[index+1]; //左遞增數組和右遞減數組最長子序列長度爲連接點右側遞減值與左側遞增值之和加一
if(sum>ans){
ans=sum+1;
}
}
}
printf("%d",ans);
}