给定一个整数数组(下标从 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
网友评论