image.png

解决思路

动态规划

image.png
image.png初始情况下每个元素的LIS值
image.png
最后每个元素的LIS值

code

  1. class Solution {
  2. public int lengthOfLIS(int[] nums) {
  3. if(nums.length==0)
  4. return 0;
  5. //memo[i]表示以nums[i]为结尾的最长上升子序列的长度
  6. int[] memo = new int[nums.length];
  7. Arrays.fill(memo,1);
  8. for(int i=1;i<nums.length;i++){
  9. for(int j=0;j<i;j++){
  10. if(nums[j]<nums[i])
  11. memo[i] = Math.max(memo[i],1+memo[j]);
  12. }
  13. }
  14. int res = 1;
  15. for(int i:memo)
  16. res = Math.max(res,i);
  17. return res;
  18. }
  19. }

动态规划+二分查找

image.png
image.png

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