题目描述
给你一个整数数组nums,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。
示例
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
思路方法
动态规划
创建一个与nums等长的数组dp[ ],dp中记录的是从开始到当前节点的最长递增子序列。
从nums数组的最左端开始遍历,若发现比之前的数组值大则进行一次判断dp[i] = Math.max(dp[i],dp[j]+1),之前节点值+1 与当前节点值进行比较并取最大值,记录下当前的最长子序列maxVal = Math.max(maxVal,dp[i])。
由于该方法是从最左端开始,并且每次是两两比较最大值,所以不存在重复问题。
class Solution {
public int lengthOfLIS(int[] nums) {
int length = nums.length;
if(length==0){
return 0;
}
int maxVal = 1;
int[] dp = new int[length];
dp[0] = 1;
for(int i=1;i<length;i++){
dp[i] =1;
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i] = Math.max(dp[i],dp[j]+1);
}
}
maxVal = Math.max(maxVal,dp[i]);
}
return maxVal;
}
}
网友评论