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?
1 public class Solution { 2 public int lengthOfLIS(int[] nums) { 3 int[] dp = new int[nums.length]; 4 int res = 0; 5 for(int i = 0;i<nums.length;i++){ 6 dp[i] = 1; 7 for(int j=0;j<i;j++){ 8 if(nums[i]>nums[j]){ 9 dp[i] = Math.max(dp[j]+1,dp[i]); 10 } 11 } 12 res = Math.max(res,dp[i]); 13 } 14 return res; 15 } 16 } 17 //the run time complexity could be O(n^2), the space complexity could be O(n);
第二种方法比较不好理解,当我们遍历数组中的每一个元素的时候,我们可以将该元素在dp中进行排序,如果该元素大于dp中的最后一个元素,则长度+1,而如果该元素不比所有元素都打,则排序到所对应的位置,更新新元素,代码如下:
1 public class Solution { 2 public int lengthOfLIS(int[] nums) { 3 int[] dp = new int[nums.length]; 4 int len = 0; 5 for(int num:nums){ 6 int i=binarysearch(dp,0,len,num); 7 if(i==len) len++; 8 } 9 return len; 10 } 11 public int binarysearch(int[] dp,int left,int right,int target){ 12 while(left<right){ 13 int mid = left+(right-left)/2; 14 if(dp[mid]>=target) right = mid; 15 else if(dp[mid]<target) left = mid+1; 16 } 17 dp[left] = target; 18 return left; 19 } 20 } 21 //the time complexity could be O(nlogn),the space complexity could be O(n)