給定乙個未經排序的整數陣列,找到最長且 連續遞增的子串行,並返回該序列的長度。
連續遞增的子串行 可以由兩個下標 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]才是結果!
/**這道題目也可以用貪心來做,也就是遇到nums[i + 1] > nums[i]的情況,count就++,否則count為1,記錄count的最大值就可以了。* 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;
}
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 就是連續遞增子串行。示...