题目描述:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
一般解法:
一般的动态规划解法的时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( n ) O(n) O(n),递推公式为:
d p [ i ] = m a x ( d p [ j ] + 1 ) dp[i] = max(dp[j] + 1) dp[i]=max(dp[j]+1)
答案为:
a n s = m a x ( d p [ i ] ) ans = max(dp[i]) ans=max(dp[i])
贪心+二分搜索
第二种方法就是使用贪心加二分搜索的方法,代码为:
public int lengthOfLIS(int[] nums) {
List<Integer> ls = new ArrayList<>();
ls.add(nums[0]);
for (int i = 1; i < nums.length; i++) {
int temp = ls.get(ls.size() - 1);
if (nums[i] > temp) {
ls.add(nums[i]);
} else {
int index = Collections.binarySearch(ls, nums[i]);
ls.set(-1 - index, nums[i]);
}
}
return ls.size();
}