๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• 300. ๆœ€้•ฟ้€’ๅขžๅญๅบๅˆ—

ๅžไฝ›็ซฅๅญ2022ๅนด6ๆœˆ9ๆ—ฅๅคง็บฆ 1 ๅˆ†้’Ÿ

๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• 300. ๆœ€้•ฟ้€’ๅขžๅญๅบๅˆ—

้šพๅบฆ: ๐ŸŒ• ๐ŸŒ• ๐ŸŒ• ๐ŸŒ•

้—ฎ้ข˜ๆ่ฟฐ

img_8.png


่งฃๆณ• 1 - dp

class Solution {
    public int lengthOfLIS(int[] nums) {
        // ๆ€่ทฏ๏ผš
        // dp[i] = max{dp[j] + 1}, j < [0, i)
        // ไปฅ i ไธบๆœซๅฐพไธ‹ๆ ‡็š„ๆœ€้•ฟ้€’ๅขžๅญๅบๅˆ—้•ฟๅบฆ
        int len = nums.length;
        int[] dp = new int[len];
        // ๅˆๅง‹ๅŒ–
        Arrays.fill(dp, 1);
        int res = 1;
        // dp
        for(int i = 1; i < len; 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(res, dp[i]);
                }
            }
        }
        return res;
    }
}

่พ“ๅ‡บ

img_6.png


่งฃๆณ•2 - ไบŒๅˆ†

class Solution {
    public int lengthOfLIS(int[] nums) {
        // ๆ€่ทฏ๏ผš
        // ๅ‘็‰Œ - ไบŒๅˆ†ๅŠ ้€ŸๆŸฅๆ‰พ็‰Œ็š„ๆ’ๅ…ฅไฝ็ฝฎ
        int count = 0;
        int len = nums.length;
        int[] array = new int[len]; // ๆœ€ๅคš len ไธช็‰Œๅ †๏ผŒๅณๅ…จ้ƒจๅ…ƒ็ด ๅฝขๆˆ้€’ๅขžๅญๅบๅˆ—
        array[0] = nums[0];
        count ++; // ๅˆๅง‹ๆœ‰ไธ€ไธช็‰Œๅ †
        // ไพๆฌกๆทปๅŠ ๆ–ฐ็‰Œๅˆฐ็‰Œๅ †ไธญ
        for(int i = 1; i < len; i ++) {
            // ็‰นๆฎŠๆƒ…ๅ†ต็‰นๅˆค
            if(nums[i] > array[count - 1]) {
                array[count] = nums[i];
                count ++;
                continue;
            }
            if(nums[i] <= array[0]) {
                array[0] = nums[i];
                continue;
            }
            // ไบŒๅˆ†็กฎๅฎšๆ’ๅ…ฅไฝ็ฝฎ
            int index = getIndex(array, 0, count - 1, nums[i]);
            array[index] = nums[i];
        }
        return count;
    }

    private int getIndex(int[] array, int left, int right, int target) {
        // ้€’ๅฝ’็ปˆๆญขๆกไปถ
        if(left >= right) {
            return left;
        }
        if(target <= array[left]) {
            return left;
        }
        int mid = left + ((right - left) >> 1);
        if(array[mid] == target) {
            return mid;
        } else if(target > array[mid]) {
            return getIndex(array, mid + 1, right, target);
        } else {
            // target < mid
            return getIndex(array, left, mid, target);
        }
    }
}

่พ“ๅ‡บ

img_7.png

ไธŠๆฌก็ผ–่พ‘ไบŽ: 2022/10/10 ไธ‹ๅˆ8:43:48
่ดก็Œฎ่€…: liuxianzhishou