300. Longest Increasing Subsequence

1、题目数组

  一、审题spa

  

  二、分析code

    给出一个无序的整形数组,求其中递增的最大序列的元素个数。blog

 

2、解答class

  一、思路方法

    方法1、im

      采用 dp 数组,长度为 nums 的元素个数。img

      ①、dp[index] 记录当前下标 index 对应元素与前边的数组元素组成的最大递增序列的个数。di

      ②、dp 全部元素初始化为 1。 当此元素值比前头 下标 i 的元素大时,dp[index] = MAX[dp[index], dp[i] + 1]。while

      ③、返回 dp 中的最大值。

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

 

  方法2、

    维护一个新数组  tails。

    ①、tails 存放最优状态的递增序列。后边出现的元素 x 有两种情况:

      a、 x比 tails 中全部元素都大,则 tails 放在尾部。

      b、tails[i - 1] < x < tails[x], 则 tails[i]  = x;

    ②、故 更新 tails 数组能够采用 二分查找。最终返回的是 tails 数组中的元素的个数。

    public int lengthOfLIS2(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;
    }
相关文章
相关标签/搜索