您的位置:首页 > 其它

LintCode 最长上升连续子序列

2017-11-03 20:17 218 查看
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]即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: