携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
题目描述
题目分析
一看到"连续"二字,我本来以为是要比300.最长递增子序列要难一些的,可是一看题解,其实要简单很多,因为是求最长连续递增子序列,中间只要有一个数不是递增就断了,就必须从新计算递增子序列的长度,每次循环都比较递增子序列的长度,更新最大值即可。
状态转移分析
1.dp[i]的定义:
dp[i]表示从0-i之间最长递增子序列的长度值
2.状态转移分析:
由dp[i]到dp[i+1]有两种情况:
如果nums[i+1]>nums[i]: dp[i+1] = dp[i] + 1
如果nums[i+1]<=nums[i]: 必须重新计算dp[i]的值 dp[i] = dp[i]
3.初始值定义:
如果nums的长度小于等于1,返回nums.length
如果nums.length > 1, 即使nums是一个递减数组,那么其最长递增子序列的长度也应该是1,所以dp初始值都为1
4.遍历顺序:
有dp[i+1] = dp[i] + 1可知,应该从前往后遍历
代码实现
var findLengthOfLCIS = function(nums) {
if (nums.length <= 1) return nums.length;
const dp = Array(nums.length).fill(1);
let result = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] < nums[i + 1]) {
// 如果nums[i+1] > nums[i] dp[i+1] 的值应该比dp[i]大1
dp[i + 1] = dp[i] + 1;
} // 如果小于等于 相当于不处理
if (dp[i] > result) result = dp[i]; // 每次循环更新最大值
}
return result;
};
贪心算法
其实本地用贪心算法可能会更好理解一些,初始化最长递增子序列的长度为count = 1,最终结果result=1;循环遍历nums数组,如果nums[i+1]>nums[i],则count++;反之则让count=1;每次循环比较count与result的大小,更新最后结果,代码实现如下:
var findLengthOfLCIS = function(nums) {
if (nums.length <= 1) return nums.length;
let result = 1;
let count = 1;
for (let i = 0; i < nums.length; i++) {
if (nums[i + 1] > nums[i]) {
count++;
} else {
count = 1;
}
if (count > result) result = count;
}
return result;
};