LeetCode:300. 最长递增子序列
经典dp
解法:
- dp [ n 2 复 杂 度 ] [n^2 复杂度] [n2复杂度]
- dp + 二分 [ n l o g n 复 杂 度 ] [nlogn 复杂度] [nlogn复杂度]
AC Code DP + 二分查找 nlogn 做法
class Solution {
public int lengthOfLIS(int[] nums) {
int len = nums.length;
int[] tails = new int[len];
int ans = 0;
for(int num : nums) {
int i = 0, j = ans;
// 找到 tails 数组中可以放入的位置
while(i < j) {
int mid = (i + j) / 2;
if(tails[mid] < num) i = mid + 1;
else j = mid;
}
tails[i] = num;
//System.out.println(Arrays.toString(tails));
if(ans == j) ans++;
}
return ans;
}
}
AC Code DP n^2 做法
class Solution {
public int lengthOfLIS(int[] nums) {
// 经典 dp | 子序列
int len = nums.length, ans = 0;
int[] dp = new int[len];
Arrays.fill(dp, 1);
for(int i = 0; i < len; i++) {
for(int j = 0; j < i; j++) {
if(nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
ans = Math.max(ans, dp[i]);
}
// System.out.println(Arrays.toString(dp));
return ans;
}
}
dp + 二分