給定一個整數數組(下標從 0 到 n-1, n 表示整個數組的規模),請找出該數組中的最長上升連續子序列。(最長上升連續子序列可以定義為從右到左或從左到右的序列。)
樣例
給定 [5, 4, 2, 1, 3], 其最長上升連續子序列(LICS)為 [5, 4, 2, 1], 返回 4.
給定 [5, 1, 2, 3, 4], 其最長上升連續子序列(LICS)為 [1, 2, 3, 4], 返回 4.
思路:兩邊遍歷,利用動態規劃思路,每當找到一個子序列比上一次找到的大,就存儲當前的子序列,注意最后遍歷結束的時候還要比較一次,因為一般寫的程序是發現下降的時候來檢查上升序列是否是最大的,如果序列本身在最后沒有下降,不檢查肯定是不合理的,一開始就錯在這里了,到vs里調試了一下看了每步的結果才弄對,兩次遍歷:
code:
int longestIncreasingContinuousSubsequence(vector<int> &A) {
int num_up=0;
int num_down=0;
int num_max[2]={0};
if(A.empty())
return 0;
if(A.size()==1)
return 1;
for(int i=1;i<A.size();i++) //一遍遍歷
{
if(A[i]>=A[i-1])
num_up++;
if(A[i]<A[i-1])
{
if(num_up>num_max[0])
num_max[0]=num_up; //如果比上一次存的大,就賦值給最大值
num_up=0; //這個清零
}
}
if(num_up>num_max[0])
num_max[0]=num_up;
//上面這個if很重要,因為可能結尾之前一直上升,我們前面的程序是在下降的時候才檢查這次的
//上升值是否比以前存的大,但是可能一直沒有下降就不檢查了么?所以跳出循環以后這里還是要檢查一次
for(int i=A.size()-2;i>=0;i--) //一遍遍歷
{
if(A[i]>=A[i+1])
num_down++;
if(A[i]<A[i+1])
{
if(num_down>num_max[1])
num_max[1]=num_down;
num_down=0;
}
}
if(num_down>num_max[1])
num_max[1]=num_down;
return (num_max[0]>num_max[1])?num_max[0]+1:num_max[1]+1;
// write your code here
}
over