动态规划解法:时间复杂度O(n2).
代码简洁,时间复杂度高。
class Solution {
public int lengthOfLIS(int[] nums) {
if(nums.length<=1)
return nums.length;
int dp[]=new int[nums.length];
Arrays.fill(dp,1);
int maxres=1;
for(int i=1;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[j]<nums[i])
dp[i]=Math.max(dp[i],dp[j]+1);
}
maxres=Math.max(maxres,dp[i]);
}
return maxres;
}
}
动态规划+二分查找,参考大神解答,
分别使用数组和list实现
class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length <= 1)
return nums.length;
int len[]=new int[nums.length];
len[0]=nums[0];
int cnt=0;
for (int i = 1; i < nums.length; i++) {
int temp = F(len, nums[i],cnt);
if(temp<cnt)
len[temp+1]=nums[i];
else
len[++cnt]=nums[i];
}
return cnt+1;
}
public static int F(int len[],int num,int cnt){
int first=0,end=cnt;
int mid=(first+end)/2;
while(first<=end){
if(num>len[end])
return end;
else if(num<len[first])
return first-1;
else if(num<len[mid])
end=mid-1;
else if(num >len[mid])
first=mid+1;
else
return mid-1;
mid=(first+end)/2;
}
return end-1;
}
}
class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length <= 1)
return nums.length;
List<Integer> len = new ArrayList<Integer>();
len.add(nums[0]);
for (int i = 1; i < nums.length; i++) {
int temp = F(len, nums[i]);
if(temp<len.size()-1)
len.set(temp+1,nums[i]);
else
len.add(nums[i]);
}
return len.size();
}
public static int F(List<Integer> len,int num){
int first=0,end=len.size()-1;
int mid=(first+end)/2;
while(first<=end){
if(num>len.get(end))
return end;
else if(num<len.get(first))
return first-1;
else if(num<len.get(mid))
end=mid-1;
else if(num >len.get(mid))
first=mid+1;
else
return mid-1;
mid=(first+end)/2;
}
return end-1;
}
}