LC.300-最长递增子序列长度题解
public class LongestIncreaseLength {
public int lengthOfLIS(int[] nums) {
//单串问题
if(nums==null || nums.length==0){
return 0;
}
int res=-1;
int dp[]=new int[nums.length];
dp[0]=1;
for(int i=0;i<nums.length;i++){
int MaxLen=1;//因为对于单个元素无论如何最低都是1了
for(int j=0;j<i;j++){//搜索前面O(n)种情况,因为他是不连续的,可以从前面的i个种作为他的上一个元素
if(nums[i]>nums[j]){//符合递增特点
MaxLen=Math.max(dp[j],MaxLen);
dp[i]=MaxLen+1;
//在递增特性中符合的选择最长序列并基础上加一
}
}
res=Math.max(dp[i],res);//刷新最大值
}
return res;//返回最大值
}
}这个是一个DP的单串问题,前置状态属于前O(n)个状态型,需要在前O(n)个状态中取最小值
dp公式:DP[n]=min(DP[n-1]...DP[0])+1 && nums[i]>nums[j]
时间复杂度为O(n^2);
查看2道真题和解析