LintCode 最长上升连续子序列

来源:互联网 发布:中国家暴数据统计2017 编辑:程序博客网 时间:2024/06/05 07:33

1.描述

给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)

注意事项

time

样例

给定 [5, 4, 2, 1, 3], 其最长上升连续子序列(LICS)为 [5, 4, 2, 1], 返回4.

给定 [5, 1, 2, 3, 4], 其最长上升连续子序列(LICS)为 [1, 2, 3, 4], 返回4.

2.分析

题目说明很清晰,最长,上升,连续,子序列。

3.代码

class Solution {
public:
    /*
     * @param A: An array of Integer
     * @return: an integer
     */
    int longestIncreasingContinuousSubsequence(vector<int> &A) {
        // write your code here
        int i,j,k;
        int cat=0;
        int dp[100005];
        for(i=0;i<A.size();i++)
            dp[i]=1;
        for(i=1;i<A.size();i++)
        {
            if(A[i]>A[i-1])
                dp[i]=dp[i-1]+1;
        }
        for(i=0;i<A.size();i++)
        {
            cat=max(cat,dp[i]);
        }
       
        for(i=0;i<A.size();i++)
            dp[i]=1;
        for(i=1;i<A.size();i++)
        {
            if(A[i]<A[i-1])
                dp[i]=dp[i-1]+1;
        }
        for(i=0;i<A.size();i++)
        {
            cat=max(cat,dp[i]);
        }
        return cat;
    }
};

4.总结

最开始看到两个测试样例时看到【54213】出来【5421】,以为因为是子序列所以必须去掉一个,后来才意识到是因为不满足上升序列,一眼看过去很容易忽视是不是上升序列,体现在程序中是最简单的A[i]<A[j],很多时候直观的表现不容易观察,程序确是忠实的为我们写下的每一句代码工作。

由于上升序列可以是从小到大,也可以是从大到小,因此类似的代码只需要更改判断条件A[i]<A[j]和A[i]>[j]即可。