lintcode 最长上升子序列

作者: yzawyx0220 | 来源:发表于2017-01-11 16:41 被阅读62次

给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。
说明
最长上升子序列的定义:
最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
https://en.wikipedia.org/wiki/Longest_increasing_subsequence
样例
给出 [5,4,1,2,3],LIS 是 [1,2,3],返回 3
给出 [4,2,4,5,3,7],LIS 是 [2,4,5,7],返回 4
题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-subsequence/

建立一个栈,为了方便计算大小我并没有使用栈,而是用的vector(数组),但是是栈的思想。每次取栈顶元素和给定数组的第i个元素做比较,如果栈顶元素小于nums[i],则将nums[i]入栈,否则在栈中使用二分法找到第一个大于nums[i]的元素,并且用nums[i]替换它(栈中的元素是递增的),最长序列的长度为count。
举例:原序列为2,5,9,3,6,8
栈为2,5,9,此时读到3,用3替换5,得到2,3,9; 再读6,用6替换9,得到2,3,6;再读8,得到最终栈为2,3,6,8。最长递增子序列为长度4。

class Solution {
public:
    /**
     * @param nums: The integer array
     * @return: The length of LIS (longest increasing subsequence)
     */
    int longestIncreasingSubsequence(vector<int> nums) {
        // write your code here
        vector<int> hel(nums.size() + 1,INT_MIN);
        int count = 0;
        for (int i = 0;i < nums.size();i++) {
            if (nums[i] > hel[count]) hel[++count] = nums[i];
            else{
                int j = 0,k = count;
                while (j < k) {
                    int mid = (j + k) / 2;
                    if (hel[mid] > nums[i]) k = mid;
                    else j = mid + 1;
                }
                hel[j] = nums[i];
            }
        }
        return count;
    }
};

相关文章

  • 公共子序列问题

    最长公共子序列 最长上升子序列 最长公共上升子序列

  • LintCode 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义: 最长上升子序列问...

  • LintCode 最长上升子序列

    题目 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明最长上升子序列的定义:最长上升子序列...

  • lintcode 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问题是在...

  • LintCode 最长上升子序列

    题目 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问...

  • 最长上升子序列

    最长上升子序列(Longest Increasing Subsequence) 最长上升子序列方案数

  • 76. 最长上升子序列

    描述 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义: 最长上升子...

  • 76. 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问题是在...

  • LintCode最长上升连续子序列

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

  • 子序列问题

    最长公共子序列 最长上升/下降/不升/不降子序列

网友评论

  • harry502:请教一下nlogn的dp怎么写
    harry502: @yzawyx0220 感觉这是一种模拟的做法吧,没有状态之间的转移,我在网上看到的dp的时间复杂度是n^2,纯暴力的时间复杂度阶乘级的,n^2的暴力做不到吧
    harry502: @yzawyx0220 能给我发一下动态转移方程吗?我感觉这个不是dp啊
    yzawyx0220:我这个就是nlogn的动态规划啊
  • harry502:暴力是n^2,dp是nlogn?

本文标题:lintcode 最长上升子序列

本文链接:https://www.haomeiwen.com/subject/czsrbttx.html