647.最長連續遞增序列
阿新 • • 發佈:2021-11-04
目錄
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;
}
}