LeetCode 300.最长上升子序列

2019-08-11  本文已影响0人  TUCJVXCB

每天一道DP防止抑郁

每天一道BinarySearch防止自闭


很巧,这道题可以用这两种方法来解

所以得到状态转移方程: dp[i] = max(dp[i], dp[j] + 1); (前提是nums[i] > nums[j])

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        if(n == 0) {
            return 0;
        }
        int[] dp = new int[n];
        int res = 1;
        Arrays.fill(dp,1); //每一个元素都可以单独作为一个上升子序列
        /*
            遍历nums数组,用当前的数 和 数组中的位置在该数之前的所有数依次比较,
            如果该数大于之前的数,那么证明可以以该数作为上升子序列的最后一个元素,
            然后用dp[j] + 1 和 dp[i] 比较,取最大的值。
         */
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                    res = Math.max(dp[i],res);
                }
            }
        }
        return res;
    }
}
class Solution {
    public int lengthOfLIS(int[] nums) {
        int index = 0;
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int res = 1;
        int[] trim = new int[n];
        trim[0] = nums[0];
        for (int i = 1; i < n; i++) {
            index = bSearch(trim,0,res,nums[i]);
            trim[index] = nums[i];
            if (index == res) {
                res++;
            }
        }
        return res;
    }

    private int bSearch (int[] nums, int low, int high,int target) {
        while (low < high) {
            int mid = low + ((high - low) >> 1);
            if (nums[mid] == target) {
                return mid;
            }else if (nums[mid] > target) {
                high = mid;
            }else {
                low = mid + 1;
            }
        }
        return low;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读