1.题目:
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的子序列。
示例 1:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
输入:nums = [0,1,0,3,2,3]
输出:4
示例 3:
输入:nums = [7,7,7,7,7,7,7]
输出:1
2.代码:
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];//dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
Arrays.fill(dp, 1);//全部都初始化为1,因为不管以哪一个为尾,长度至少都是1
for(int i=0;i<nums.length;i++){//遍历数组
for(int j=0;j<i;j++){//注意限制条件是小于i
if(nums[i]>nums[j]){//注意限制条件,这样才可以是一个递增子序列
dp[i]=Math.max(dp[j]+1,dp[i]);//递推公式,d[i]表示之前的递增子序列的长度
}
}
}
int max=0;//最后还是要遍历整个dp数组,才能找到最长的递增子序列
for(int i=0;i<dp.length;i++){
if(dp[i]>max) max=dp[i];
System.out.println(dp[i]);
}
return max;
}
}