300. Longest Increasing Subsequence 最长递增序列

https://leetcode.com/problems/longest-increasing-subsequence/

300. Longest Increasing Subsequence 最长递增序列

// class Solution {
//     //动态规划。在i位置上的dp值,应该是两者额较大值:1.原dp 2.比nums[i]小的nums[j]的j位置上的dp值加一
//     public int lengthOfLIS(int[] nums) {
//         if(nums==null || nums.length==0) return 0;
//         int[] dp = new int[nums.length];
//         int res = 0;
//         for(int i=0; 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(dp[i], res);
//         }
//         return res+1;
//     }
// }

class Solution {
    //nlogn的解法  https://blog.****.net/jmspan/article/details/51171519
    //https://www.jianshu.com/p/a3cd9df6d9d1
    public int lengthOfLIS(int[] nums) { 
        int[] increasing = new int[nums.length];
        int size = 0;  //increasing数组中放置的元素个数
        for(int i=0; i<nums.length; i++) {
            int left=0, right=size-1;
            while (left<=right) {  //二分查找increasing数组中第一个比nums[i]大的元素
                int m=(left+right)/2;
                if (nums[i] > increasing[m]) left = m + 1;
                else right = m - 1;
            }
            increasing[left] = nums[i];
            if (left==size) size ++;
        }
        return size;
    }
}