674 最長連續遞增序列

2022-09-08 08:15:13 字數 1738 閱讀 1469

給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。

連續遞增的子串行 可以由兩個下標 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。

動規五部曲分析如下:

確定dp陣列(dp table)以及下標的含義

dp[i]:以下標i為結尾的陣列的連續遞增的子串行長度為dp[i]。

注意這裡的定義,一定是以下標i為結尾,並不是說一定以下標0為起始位置。

確定遞推公式

如果 nums[i + 1] > nums[i],那麼以 i+1 為結尾的陣列的連續遞增的子串行長度 一定等於 以i為結尾的陣列的連續遞增的子串行長度 + 1 。

即:dp[i + 1] = dp[i] + 1;

因為本題要求連續遞增子串行,所以就必要比較nums[i + 1]與nums[i],而不用去比較nums[j]與nums[i] (j是在0到i之間遍歷)。

既然不用j了,那麼也不用兩層for迴圈,本題一層for迴圈就行,比較nums[i + 1] 和 nums[i]。

好好體會一下!

dp陣列如何初始化

以下標i為結尾的陣列的連續遞增的子串行長度最少也應該是1,即就是nums[i]這乙個元素。

所以dp[i]應該初始1;

確定遍歷順序

從遞推公式上可以看出, dp[i + 1]依賴dp[i],所以一定是從前向後遍歷。

for (int i = 0; i < nums.size() - 1; i++) 

}

舉例推導dp陣列

已輸入nums = [1,3,5,4,7]為例,dp陣列狀態如下:

注意這裡要取dp[i]裡的最大值,所以dp[2]才是結果!

/**

* 1.dp[i] 代表當前下表最大連續值

* 2.遞推公式 if(nums[i+1]>nums[i]) dp[i+1] = dp[i]+1

* 3.初始化 都為1

* 4.遍歷方向,從其那往後

* 5.結果推導 。。。。

* @param nums

* @return

*/public static int findlengthoflcis(int nums)

int res = 1;

for (int i = 0; i < nums.length - 1; i++)

res = res > dp[i + 1] ? res : dp[i + 1];

}return res;

}

這道題目也可以用貪心來做,也就是遇到nums[i + 1] > nums[i]的情況,count就++,否則count為1,記錄count的最大值就可以了。

674 最長連續遞增序列

題目描述 給定乙個未經排序的整數陣列,找到最長且連續的的遞增序列,並返回該序列的長度。示例 1 輸入 1,3,5,4,7 輸出 3 解釋 最長連續遞增序列是 1,3,5 長度為3。儘管 1,3,5,7 也是公升序的子串行,但它不是連續的,因為5和7在原陣列裡被4隔開。示例 2 輸入 2,2,2,2,...

674 最長連續遞增序列

一 題目描述 給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。連續遞增的子串行 可以由兩個下標 l 和 r l r 確定,如果對於每個 l i r,都有 nums i nums i 1 那麼子串行 nums l nums l 1 nums r 1 nums r 就是連續...

674 最長連續遞增序列

給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。連續遞增的子串行 可以由兩個下標 l 和 r l r 確定,如果對於每個 l i r,都有 nums i nums i 1 那麼子串行 nums l nums l 1 nums r 1 nums r 就是連續遞增子串行。示...