網站免費正能量入口/百度首頁推薦關不掉嗎
今日份題目:
給你一個整數數組 nums
,找到其中最長嚴格遞增子序列的長度。
子序列 是由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。例如,[3,6,2,7]
是數組 [0,3,1,6,2,2,7]
的子序列。
示例1
輸入:nums = [10,9,2,5,3,7,101,18] 輸出:4 解釋:最長遞增子序列是 [2,3,7,101],因此長度為 4 。
示例2
輸入:nums = [0,1,0,3,2,3] 輸出:4
示例3
輸入:nums = [7,7,7,7,7,7,7] 輸出:1
提示
-
1 <= nums.length <= 2500
-
-104 <= nums[i] <= 104
題目思路
動態(tài)規(guī)劃的精髓,我認為,就是站在當前位置做出判斷進而得出結果。
本題中,使用一維dp數組記錄到目前為止,滿足要求的遞增序列的最大長度。那么站在當前位置,需要進行的判斷是,如果前邊沒有比我小的,那么我會為1,否則我應該是最長的那個遞增序列的長度加一。故得到狀態(tài)轉移方程:dp[i]=max(dp[i],dp[j]+1);
代碼
class Solution
{
public:int lengthOfLIS(vector<int>& nums) {if(nums.size()==0) return 0;int maxn=0;int dp[3000]={0};dp[0]=1;maxn=1;int temp=0;for(int i=1;i<nums.size();i++){dp[i]=1;for(int j=0;j<i;j++){if(nums[j]<nums[i]) {dp[i]=max(dp[i],dp[j]+1);} }}int res=0;for(int i=0;i<nums.size();i++){res=max(res,dp[i]);}return res;}
};
提交結果
?歡迎大家在評論區(qū)討論,如有不懂的代碼部分,歡迎在評論區(qū)留言!