题目描述:
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。
Level | AC rate |
Easy | 53.9% |
题目解析(贪心算法):
我们遍历整个数组,找出所有的连续递增子序列,返回其中的最大长度即为本题答案。可以使用一个变量(sta),来对连续递增子序列的起始位进行标记,直到子序列的结束位(i),那么这个子序列的长度为(i-sta+1),如何判断到了子序列的结束位,只需要判断这个数的下一位数是否大于该数,若是则还没到达子序列的结束位,若不是则到达了,代码如下:
java:
class Solution {
public int findLengthOfLCIS(int[] nums) {
int sta = 0;
int ans = 0;
if(nums.length==1)return 1;
for(int i = 1; i<nums.length; i++){
if(nums[i]<=nums[i-1]){
sta = i;
}
ans = Math.max(ans,i-sta+1);
}
return ans;
}
}
执行用时:1 ms, 在所有 Java 提交中击败了99.90%的用户
内存消耗:41.9 MB, 在所有 Java 提交中击败了58.06%的用户
C++:
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int ans = 0;
int n = nums.size();
int start = 0;
for (int i = 0; i < n; i++) {
if (i > 0 && nums[i] <= nums[i - 1]) {
start = i;
}
ans = max(ans, i - start + 1);
}
return ans;
}
};
C:
int findLengthOfLCIS(int* nums, int numsSize) {
int ans = 0;
int start = 0;
for (int i = 0; i < numsSize; i++) {
if (i > 0 && nums[i] <= nums[i - 1]) {
start = i;
}
ans = fmax(ans, i - start + 1);
}
return ans;
}