647.最长连续递增序列

674.最长连续递增序列

最长上升子序列(Longest Increasing Subsequence)

题目

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 

示例 2:

输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

提示:

1 <= nums.length <= 104
-109 <= nums[i] <= 109

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解1-动态规划

  • 多阶段决策
  • 不问具体解,只求最优解

可以采用 动态规划 求解

确定dp数组及其下标的含义

dp[i]:以nums[i]结尾的最长连续递增子序列的长度为dp[i]

image

递推式

dp[i]如何推出?
这道题是连续,那么只要nums[i]>nums[i-1],就可以加入以i-1的结尾的连续递增子序列之中,dp[i] = dp[i-1]+1。
如果nums[i]<=nums[i-1],说明以当前元素结尾,就是它本身dp[i]=1

初始化

每个数都可以以自身结尾,dp[i]=1

遍历顺序
dp[i]的值依赖于dp[i-1]

这里的返回值应该是最大的dp[i]值

int result = 0;
dp[0] = 1; //初始化,分开写减少循环次数

for(int i =1;i<nums.length;i++){
	dp[i] = 1; //初始化
	if(nums[i]>nums[i-1])dp[i] = dp[i-1]+1;
	if(result<dp[i])result = dp[i]; //更新最大值
}
return result;

代码

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int len = nums.length;
        if(len == 1) return 1;
        int result = 0;
        int dp [] = new int [len];
        dp[0] = 1; 
      
    for(int i =1;i<len;i++){
    	dp[i] = 1; 
	    if(nums[i]>nums[i-1])dp[i] = dp[i-1]+1;
	    if(result<dp[i])result = dp[i];
    }
    return result;
    }
}
posted @ 2021-11-04 10:40  rananie  阅读(52)  评论(0编辑  收藏  举报