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