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;
    }
相關文章
相關標籤/搜索