链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence/solution/-by-xun-ge-v-b5ck/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目![](https://img-blog.csdnimg.cn/fe00685a2fcc4b0a8479309a87a6f89c.png)
示例![](https://img-blog.csdnimg.cn/656e663ac8da4192ac76447fe9411234.png)
思路
小知识 memset每次只能对一个字节的单位赋值,所以当用memset个int型数赋 1 时,实际赋为 00000001 00000001 00000001 00000001
- 确定dp数组(dp table)以及下标的含义
dp[i]:以下标i为结尾的数组的连续递增的子序列长度为dp[i]。
注意这里的定义,一定是以下标i为结尾,并不是说一定以下标0为起始位置。
- 确定递推公式
如果 nums[i + 1] > nums[i],那么以 i+1 为结尾的数组的连续递增的子序列长度 一定等于 以i为结尾的数组的连续递增的子序列长度 + 1 。
即:dp[i + 1] = dp[i] + 1;
因为本题要求连续递增子序列,所以就必要比较nums[i + 1]与nums[i],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。
既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i + 1] 和 nums[i]。
这里大家要好好体会一下!
- dp数组如何初始化
以下标i为结尾的数组的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。
所以dp[i]应该初始1;
- 确定遍历顺序
从递推公式上可以看出, dp[i + 1]依赖dp[i],所以一定是从前向后遍历。
代码
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int findLengthOfLCIS(int* nums, int numsSize){
int dp[numsSize];
dp[0] = 1;
int max = 1;
for(int i = 1; i < numsSize; i++)
{
dp[i] = 1;
if(nums[i] > nums[i-1])
dp[i] = dp[i-1] + 1;
max = MAX(max, dp[i]);
}
return max;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence/solution/-by-xun-ge-v-b5ck/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。