难度:简单
题目:
给定一个未经排序的整数数组,找到最长且连续的的递增序列。
示例 1:
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。
示例2:
输入: [2,2,2,2,2]
输出: 1
解释: 最长连续递增序列是 [2], 长度为1。
限制:
数组长度不会超过10000。
算法与C代码
法一:一次遍历
基本思想:一次遍历,判断是否和后续元素发生逆序。只不过需要注意一下是顺序的特殊情况以及长度为0和1的时候的情况即可。
//法一: 动态规划
int findLengthOfLCIS(int* nums, int numsSize){
int max = 0, count = 1, i; //对于序列的长度, 至少会达到1
if(numsSize==0) { //考虑到极端情况
return 0;
}
for(i = 0;i<numsSize - 1;++i){
if(nums[i] < nums[i+1]){ //相同的元素不算入递增
count++;
}
else{ //逆序或等于
if(count>max){
max = count;
}
count = 1;
}
}
//当数组全部递增, 上面的循环无法处理赋max值,经常有这种需要.
if(count>max){ //防止全部递增, 无逆序
max = count;
}
return max;
}
法二:动态规划
//法二: 动态规划
int findLengthOfLCIS(int* nums, int numsSize){
if(numsSize==0){ //极端情况
return 0;
}
int dp[numsSize]; //1表示以nums[i]结尾的递增子序列的长度
int i, max = 1;
for(i = 0;i < numsSize;++i){
dp[i] = 1;
}
for(i = 1;i<numsSize;++i){
if(nums[i]>nums[i-1]){
dp[i] = dp[i-1] + 1; //递归式
if(dp[i]>max){
max = dp[i];
}
}
}
return max;
}