leetcode [300]Longest Increasing Subsequence

Given an unsorted array of integers, find the length of longest increasing subsequence.

Example:

Input: [10,9,2,5,3,7,101,18]
Output: 4 
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4. 

Note:

  • There may be more than one LIS combination, it is only necessary for you to return the length.
  • Your algorithm should run in O(n2) complexity.

Follow up: Could you improve it to O(n log n) time complexity?

题目大意:

找出最长上升子序列的长度。

解法:

采用动态规划的方法,使用一个dp[index]数组来记录到当前index的子序列长度,这种解法的时间复杂度是O(n^2)。

java:

class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums.length==0) return 0;
        int[] dp=new int[nums.length];
        Arrays.fill(dp,1);
        int res=1;
        for (int i=1;i<nums.length;i++){
            for (int j=0;j<i;j++){
                if (nums[j]<nums[i]) {
                    dp[i]=Math.max(dp[i],dp[j]+1);
                    res=Math.max(res,dp[i]);
                }
            }
        }
        return res;
    }
}

网上最优的解法:

没太看懂...

class Solution {
    public int lengthOfLIS(int[] nums) {
        int[] tails=new int[nums.length];
        int size=0;
        for (int x:nums){
            int i=0,j=size;
            while (i!=j){
                int m=(i+j)/2;
                if (tails[m]<x) i=m+1;
                else j=m;
            }
            tails[i]=x;
            if (i==size) ++size;
        }

        return size;
    }
}
posted @ 2019-05-14 21:06  小白兔云  阅读(99)  评论(0编辑  收藏  举报