思路
参考如下: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;
}
}
运行结果:

博客介绍了解决升序子序列问题的思路,给出参考链接。展示了迭代累计和动态规划两种提交代码及运行结果。其中动态规划方法维护一个dp[]数组,用于记录到当前元素为止最长升序子序列的长度。
454

被折叠的 条评论
为什么被折叠?



