leetcode300. 最长递增子序列
生活随笔
收集整理的這篇文章主要介紹了
leetcode300. 最长递增子序列
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:題目
二:上碼
class Solution { public:/**思路:1.分析題意:我們?cè)谇笕〈鸢傅倪^程中;我們的結(jié)果是動(dòng)態(tài)的; 如果從某個(gè)數(shù)有一個(gè)遞增序列 但是在這個(gè)數(shù)的后面又有一個(gè)數(shù)又可以是遞增的 而且可能還比起長(zhǎng) 2.動(dòng)態(tài)規(guī)劃五步走1>:確定dp數(shù)組的含義以及下標(biāo)的含義dp[i] 表示的是 i 之前的數(shù) 且包括i的 最長(zhǎng)上升子序列長(zhǎng)度這里就是 i 之前的數(shù)到最后下標(biāo)會(huì)有一個(gè)遞增序列 但是我們要取得是最長(zhǎng)的 2>:確定dp數(shù)組的狀態(tài)轉(zhuǎn)移方程if(nums[i] > nums[j]) dp[i] = max(dp[j]+1,dp[i]);當(dāng)出現(xiàn)nums[i] > nums[j] 的時(shí)候 我們就需要注意的是 那么dp[j]的值就需要改變了 因?yàn)楹竺嬗殖霈F(xiàn)一個(gè)比其要大的值,所以我們需要跟當(dāng)前的dp[i]進(jìn)行比較從[0,i-1]的遍歷過程中(也就是內(nèi)循環(huán))我們需要知道的是dp[i]是動(dòng)態(tài)變化的eg: 0 1 2 3 4 5 6 6 7 8 9 2 3 10.... 當(dāng)i為6的時(shí)候 nums[i] = 10 比前面的數(shù)都大,dp[i] = 1 //初始值j = 0 dp[i] = 2j = 1 dp[i] = max(dp[i],dp[j]+1) = 3//這里我們需要知道的是 dp[1] =2 dp[2] = 3 因?yàn)槲覀兪菑?/前往后遍歷的j= 2 dp[i] = max(dp[i],dp[j]+1) = 4//這里max中dp[6] = 3 但是dp[2] + 1 = 4j = 3 dp[i] = 5j= 4 dp[i] = max(dp[i],dp[j]+1) = 4//這里的dp[j=4] = 1 但是我們的dp[i] = 4的//這也就是回歸到我們的dp[i]含義上了 也就是序列//[0,i]中的最長(zhǎng)增長(zhǎng)序列 3>:確定dp數(shù)組的初始化 無論哪個(gè)數(shù)都是14>:確定dp數(shù)組的遍歷順序我們的dp[i]是比較其前面的幾個(gè)數(shù)的最大值的遍歷i在外層 j在內(nèi)層for(int i = 1; i < nums.size(); i++) {for(int j = 0; j < i; j++) {if(nums[i] > nums[j])dp[i] = max(dp[j]+1,dp[i]); //dp[i] 表示的是i之前且包括i的最大值}}5>:舉例驗(yàn)證0 1 0 3 2 0 1 2 3 4 初始化 1 1 1 1 1i=1 1 2 1 1 1i=2 1 2 1 1 1i=3 1 2 1 3 1 //關(guān)于這里的3 我們需啊喲注意的是我們是遍歷完[0,i-1]后取的最值i=4 1 2 1 3 3*/int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);for (int i = 1; i < nums.size(); i++) {//這里我們先需要從1開始 因?yàn)槲覀兊氖且?jì)算從[0,i-1]之前的最大值for (int j = 0; j < i; j++) {if(nums[i] > nums[j]) dp[i] = max(dp[i],dp[j]+1);}}int ans = 0;for(auto num: dp) {ans = max(ans,num);}return ans;} };總結(jié)
以上是生活随笔為你收集整理的leetcode300. 最长递增子序列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机自动点击器教程
- 下一篇: leetcode674. 最长连续递增序