1. 程式人生 > 其它 >647.最長連續遞增序列

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]

遞推式

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;
    }
}