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;
        }
    };
    

    相关文章

      网友评论

      • 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