題目:
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
