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?
Credits:
Special thanks to @pbrother for adding this problem and creating all test cases.
Subscribe to see which companies asked this question.
典型的动态规划问题.
定义数组dp,dp[i]表示nums[0...i]之间的最大递增子序列的长度。
所以,根据dp[0..i-1],求i时:从所有满足nums[i]>nums[j](j=0..i-1)的j中选择最大的dp[j],然后加1即为求得的dp[i]。
最后选择dp数组中的最大值.
/** * 典型的动态规划问题. * 定义数组dp,dp[i]表示nums[0...i]之间的最大递增子序列的长度。 * 所以,根据dp[0..i-1],求i时:从所有满足nums[i]>nums[j](j=0..i-1)的j中选择最大的dp[j],然后加1即为求得的dp[i]。 * 最后选择dp数组中的最大值 */ public int lengthOfLIS(int[] nums) { int len = nums.length; if(len <= 1){ return len; } /*定义数组dp,dp[i]表示nums[0...i]之间的最大递增子序列的长度。*/ int dp[] = new int[len]; dp[0] = 1; /*计算dp数组*/ for(int i = 1;i<len;i++){ int maxdp = 0; for(int j = 0; j<i; j++){ if(nums[i] > nums[j] && maxdp < dp[j]){ maxdp = dp[j]; } } dp[i] = maxdp + 1; } /*选择dp数组中最大的*/ int max = dp[0]; for(int i = 0;i<len;i++){ if(max<dp[i]){ max = dp[i]; } } return max; }