300. Longest Increasing Subsequence


題目:

Given an unsorted array of integers, find the length of longest increasing subsequence.

For example,
Given [10, 9, 2, 5, 3, 7, 101, 18],
The longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. Note that there may be more than one LIS combination, it is only necessary for you to return the length.

Your algorithm should run in O(n2) complexity.

Follow up: Could you improve it to O(n log n) time complexity? 

鏈接: http://leetcode.com/problems/longest-increasing-subsequence/

題解:

求數組的最長遞增子序列。經典dp問題,在很多大學講DP的教程里,都會出現這道題以及Longest Common Subsequence。 這里其實也有O(nlogn)的方法,比如Patience Sorting一類的,二刷再研究。下面我們來看DP。這個問題一開始可以被分解為recursive的子問題,一步一步優化就可以得到帶有memorization的iterative解法。初始化dp[i] = 1,即一個元素的遞增序列。 假設以i - 1結尾的subarray里的LIS為dp[i - 1],那么我們要求以i結尾的subarray里的LIS,dp[i]的時候,要把這個新的元素和之前所有的元素進行比較,同時逐步比較dp[j] + 1與dp[i],假如發現更長的序列,我們則更新dp[i] = dp[j] + 1,繼續增加j進行比較。當i之前的元素全部便利完畢以后,我們得到了當前以i結尾的subarray里的LIS,就是dp[i]。

Time Complexity - O(n2), Space Complexity - O(n2)。

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

題外話:

#300題!又是一個里程碑了。雖然之前做的很多題目都忘記了,但相信二刷會好好鞏固和再學習。微信群里一起刷題的小伙伴們,好多已經拿到了Amazon的Offer,我也要好好努力才行啊。這周休假在家,周三繼續修理房子,希望一切順利。 同時希望在這周能夠把LeetCode第一遍完成,然后早日學習新的知識,比如多線程,設計模式,以及一些系統設計等等。

Reference:

https://leetcode.com/discuss/67609/short-java-solution-using-dp-o-n-log-n

https://leetcode.com/discuss/67554/9-lines-c-code-with-o-nlogn-complexity

https://leetcode.com/discuss/67533/c-typical-dp-2-solution-and-nlogn-solution-from-geekforgeek

https://leetcode.com/discuss/67565/simple-java-o-nlogn-solution

https://leetcode.com/discuss/71129/space-log-time-short-solution-without-additional-memory-java

https://leetcode.com/discuss/67687/c-o-nlogn-solution-with-explainations-4ms

https://leetcode.com/discuss/69309/c-o-nlogn-with-explanation-and-references

https://leetcode.com/discuss/67572/o-nlogn-and-o-n-2-java-solutions

https://leetcode.com/discuss/67689/4ms-o-nlogn-non-recursive-easy-to-understand-java-solution

https://leetcode.com/discuss/67553/share-java-dp-solution

https://leetcode.com/discuss/72127/easy-to-understand-solution-using-dp-with-video-explanation

https://leetcode.com/discuss/67806/another-o-n-log-n-python

http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/

http://www.cs.cornell.edu/~wdtseng/icpc/notes/dp2.pdf

https://courses.engr.illinois.edu/cs473/sp2011/lectures/08_notes.pdf

http://www.cs.toronto.edu/~vassos/teaching/c73/handouts/lis.pdf

http://www.cs.mun.ca/~kol/courses/2711-w08/dynprog-2711.pdf

https://courses.cs.washington.edu/courses/cse417/02wi/slides/06dp-lis.pdf

https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/LongestIncreasingSubsequence.pdf

https://en.wikipedia.org/wiki/Patience_sorting

https://en.wikipedia.org/wiki/Longest_increasing_subsequence


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM