300. 最长递增子序列

2021-09-20  本文已影响0人  眼若繁星丶
300. 最长递增子序列

Ⅰ、动态规划

dp[i] = max(dp[j]) + 1;\ 0 <= j < i \ \cap num[j] < num[i]

LIS_{length} = max(dp[i]); \ 0 <= i < n

public class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        if (n == 0) return 0;
        int[] dp = new int[n];
        dp[0] = 1;
        int maxLen = 1;
        for (int i = 1; i < n; i++) {
            dp[i] = 1;
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i])
                    dp[i] = Math.max(dp[i], dp[j] + 1);
            }
            maxLen = Math.max(maxLen, dp[i]);
        }
        return maxLen;
    }
}

Ⅱ、二分查找 + 贪心

public int lengthOfLIS(int[] nums) {
    int[] tails = new int[nums.length];
    int res = 0;
    for (int num : nums) {
        int l = 0, r = res; // 确定好 tails 区间范围
        while (l < r) {
            int mid = l + ((r - l) >>> 1);
            if (num > tails[mid])
                l = mid + 1;
            else
                r = mid;
        }
        tails[l] = num; // 当前值替换二分找到的 l 位置
        if (res == r) res++; // 需要“扩容”
    }
    return res;
}
上一篇 下一篇

猜你喜欢

热点阅读