
解决思路
动态规划

初始情况下每个元素的LIS值

最后每个元素的LIS值
code
class Solution {
public int lengthOfLIS(int[] nums) {
if(nums.length==0)
return 0;
//memo[i]表示以nums[i]为结尾的最长上升子序列的长度
int[] memo = new int[nums.length];
Arrays.fill(memo,1);
for(int i=1;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[j]<nums[i])
memo[i] = Math.max(memo[i],1+memo[j]);
}
}
int res = 1;
for(int i:memo)
res = Math.max(res,i);
return res;
}
}
动态规划+二分查找


class Solution {
public int lengthOfLIS(int[] nums) {
int[] tails = new int[nums.length];
int res = 0;
for(int num : nums) {
int i = 0, j = res;
while(i < j) {
int m = (i + j) / 2;
if(tails[m] < num) i = m + 1;
else j = m;
}
tails[i] = num;
if(res == j) res++;
}
return res;
}
}