目录
每日一句
以积财货之心积学问,以求功名之心求道德
作者简介
🏡个人主页:XiaoChen_Android
📚学习专栏:力扣专栏
🕒发布日期:2022/8/17
『LeetCode|每日一题』
1.每日一题
2.解题思路
2.1 思路分析
此题为经典的动态规划题目,当要求下标为i的最长递增子序列,可以从i - 1往前遍历,找到长度最大的,关键在于判断条件
S1:首先定义一个数组len,用来存某位置的元素为序列最后一个元素的长度,很显然最少递增长度都为1;
S2:当nums[j] < nums[i] 并且此时的最长递增长度len[j] > maxLen(1 <= j < i),此时应该改变maxLen的值为len[j];
S3:当nums[j] < nums[i],但是len[j] < maxLen时,我们可以这样理解,把它加进来还是没别人长,所以不用它这个元素,maxLen的值不变;
S4:当nums[j] > nums[i]时,前面的元素反而大与后一个元素,这个元素同样不用,maxLen不变;
S5:内层循环结束之后,不能忘记len[i] = maxLen + 1这一步(因为初始化maxLen为0,所以要加一);
S6:最后把len数组中最大的数返回就好了
2.2 核心代码(dp)
for(int i = 1 ; i < nums.length ; i ++){
maxLen = 0;
for(int j = i - 1 ; j >= 0 ; j --){
if(nums[j] < nums[i] && len[j] > maxLen){
maxLen = len[j];
}
}
len[i] = maxLen + 1;
}
2.3 全部代码
class Solution {
static int maxLen;
public int lengthOfLIS(int[] nums) {
str(nums);
return maxLen;
}
private static void str(int[] nums){
int[] len = new int[nums.length]; //存某位置的元素为序列最后一个元素的长度
Arrays.fill(len , 1);
for(int i = 1 ; i < nums.length ; i ++){
maxLen = 0;
for(int j = i - 1 ; j >= 0 ; j --){
if(nums[j] < nums[i] && len[j] > maxLen){
maxLen = len[j];
}
}
len[i] = maxLen + 1;
}
maxLen = len[0];
for(int i = 1 ; i < len.length ; i ++){
if(maxLen < len[i]){
maxLen = len[i];
}
}
}
}
2.4 运行结果
🍁 类似题目推荐:
如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!