LintCode397 最长上升连续子序列

问题:

给定一个整数数组(下标从 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.

分析:

  • 递推关系式如何确定?f(i) 表示前i个数字中 最长上升子序列的长度,注意,其所包含的最长连续上升子序列未必是以i结尾的。因此思路来了。令dp[i]表示以以i结尾的连续上升子序列长度,
    dp[i] = (A[i]>A[i-1])?dp[i-1]+1:1,局部是贪心的。开一个全局变量记录局部遍历的最大值即可。

  • 注意顺序 逆序两种情况,可以放在同一个循环中处理。

代码:

int longestIncreasingContinuousSubsequence(vector<int>& A) {
        // Write your code here
        int n = A.size();
        if(n<1){
            return 0;
        }
        if(n<2){
            return 1;
        }
        //开两个数组存储之前状态
        vector<int> dp1(n,1);
        vector<int> dp2(n,1);
        dp1[0] = dp2[0]=1;
        int glomax=0;
        for(int i=1;i<n;i++){
            dp1[i] = (A[i]>A[i-1])?dp1[i-1]+1:1;
            dp2[i] = (A[i]<A[i-1])?dp2[i-1]+1:1;
            glomax = max(glomax,max(dp1[i],dp2[i]));
        }
        return glomax;
    }

事实上,根据状态依赖关系,O(n)空间复杂度依然可以省掉

int longestIncreasingContinuousSubsequence(vector<int>& A) {
        // Write your code here
        int n = A.size();
        if(n<1){
            return 0;
        }
        if(n<2){
            return 1;
        }
        int dp1=1,dp2=1;
        int glomax=0;
        for(int i=1;i<n;i++){
            dp1 = (A[i]>A[i-1])?dp1+1:1;
            dp2 = (A[i]<A[i-1])?dp2+1:1;
            glomax = max(glomax,max(dp1,dp2));
        }
        return glomax;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 8,819评论 0 18
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,353评论 0 33
  • 算法简述 最长上升子序列(Longest Increasing Subsequence, 简称LIS)是dp中比较...
    xiaoshua阅读 12,020评论 0 5
  • 描述 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义:最长上升子序...
    6默默Welsh阅读 3,928评论 1 0
  • 什么是HTML HTML其实是HyperText Markup Language的缩写, 超文本标记语言 HTML...
    cheney0217阅读 3,118评论 0 1