LeetCode-300.Longst 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,时间复杂度为O(n2)

 1 public int lengthOfLIS(int[] nums) {//dp my
 2         if(null==nums||0==nums.length){
 3             return 0;
 4         }
 5         int max= 1;
 6         int[] re = new int[nums.length];//存放当前位置的最大长度
 7         re[0]=1;
 8         for(int i=1;i<nums.length;i++){
 9             re[i]=0;
10             for(int j=i-1;j>=0;j--){
11                 if(nums[j]<nums[i]&&re[i]<re[j]){//从当前位置往前,第一个比nums[i]小的值
12                     re[i] = re[j];
13                 }
14             }
15             re[i]++;
16             if(re[i]>max){
17                 max =re[i];
18             }
19         }
20         return max;
21     }

利用二分,时间复杂度为O(nlogn)

public int lengthOfLIS(int[] nums) {//二分 mytip
        if(null==nums||0==nums.length){
            return 0;
        }
        List<Integer> re = new ArrayList<>();//
        re.add(nums[0]);
        int index = 0;
        for(int i=1;i<nums.length;i++){
            if(nums[i]>re.get(re.size()-1)){//如果大于最后一个元素,直接插入
                re.add(nums[i]);
            }
            else{
                index = bs(0,re.size()-1,re,nums[i]);//二分找到第一个不大于nusm[i]的数的下标,然后替换为当前数
                re.set(index,nums[i]);
                
            }
        }
        return re.size();//数组长度为最大值
    }
    private int bs(int left,int right,List<Integer> list,int num){
        while(left<=right){
            if(left >= right){
                return left;
            }
            else{
                int mid = left + (right - left)/2;
                if(list.get(mid)<num){
                    left = mid+1;
                }
                else{
                    right =mid;
                }
            }
        }
        return left;
    }
原文地址:https://www.cnblogs.com/zhacai/p/10661330.html