思路
参考如下:https://segmentfault.com/a/1190000003819886
提交代码:迭代累计
class Solution{
public int lengthOfLIS(int[] nums) {
int[] ends=new int[nums.length];
int i,j,mid,size=0;
for(Integer num : nums) {
i=0;j=size;
while(i<j) {
mid=(i+j)/2;
if(num>ends[mid])
i=mid+1;
else
j=mid;
}
ends[i]=num;
if(i==size) size++;
}
return size;
}
}
运行结果
提交代码:动态规划
维护一个dp[]数组,数组元素表示到当前元素为止,最长的升序子序列是多长。
class Solution{
public int lengthOfLIS(int[] nums) {
if(nums==null||nums.length==0) return 0;
int size=0,len=nums.length;
int[] dp=new int[len];
dp[0]=1;
for(int i=0;i<len;i++) {
for(int j=0;j<i;j++) {
if(nums[j]>=nums[i]) {
dp[i]=dp[i]==0?dp[j]:dp[i];
}
else if(dp[i]<dp[j]+1)
dp[i]=dp[j]+1;
}
size=Math.max(size, dp[i]);
}
return size;
}
}