Day14 最长上升子序列的长度(动态规划)
结合图片和代码解析理解代码吧
class Solution {
public int lengthOfLIS(int[] nums) {
//动态规划
if(nums.length==0){
return 0;
}
//dp[i]代表数组中第<=i的子数组中最长上升子序列长度
int[] dp = new int[nums.length];
int maxAns = 1;
for(int i=0;i<nums.length;i++){
int maxBeforeI = 0; //定义dp[<i]中最大的值,即子数组最长上升子序列长度
dp[i] = 1;
for(int j=0;j<i;j++){
//找到nums[i]>nums[j]时候 dp[1..j]中的最大值
//只有nums[i]>nums[i]的时候,才会出现最长生长子序列递增,才去更新dp
if(nums[i]>nums[j]){
maxBeforeI = Math.max(maxBeforeI,dp[j]);
}
}
dp[i] = maxBeforeI+1;
maxAns = Math.max(maxAns,dp[i]);
}
return maxAns;
}
}
类似题目:
class Solution {
public boolean increasingTriplet(int[] nums) {
if(nums.length<3){
return false;
}
int[] dp = new int[nums.length];
for(int i=0;i<nums.length;i++){
int maxBeforeI = 0;
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
maxBeforeI = Math.max(maxBeforeI,dp[j]);
}
}
dp[i] = maxBeforeI + 1;
}
for(int i:dp){
if(i>=3){
return true;
}
}
return false;
}
}