leetcode300. 最长递增子序列
生活随笔
收集整理的這篇文章主要介紹了
leetcode300. 最长递增子序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
二:上碼
class Solution { public:/**思路:1.分析題意:我們在求取答案的過程中;我們的結果是動態的; 如果從某個數有一個遞增序列 但是在這個數的后面又有一個數又可以是遞增的 而且可能還比起長 2.動態規劃五步走1>:確定dp數組的含義以及下標的含義dp[i] 表示的是 i 之前的數 且包括i的 最長上升子序列長度這里就是 i 之前的數到最后下標會有一個遞增序列 但是我們要取得是最長的 2>:確定dp數組的狀態轉移方程if(nums[i] > nums[j]) dp[i] = max(dp[j]+1,dp[i]);當出現nums[i] > nums[j] 的時候 我們就需要注意的是 那么dp[j]的值就需要改變了 因為后面又出現一個比其要大的值,所以我們需要跟當前的dp[i]進行比較從[0,i-1]的遍歷過程中(也就是內循環)我們需要知道的是dp[i]是動態變化的eg: 0 1 2 3 4 5 6 6 7 8 9 2 3 10.... 當i為6的時候 nums[i] = 10 比前面的數都大,dp[i] = 1 //初始值j = 0 dp[i] = 2j = 1 dp[i] = max(dp[i],dp[j]+1) = 3//這里我們需要知道的是 dp[1] =2 dp[2] = 3 因為我們是從//前往后遍歷的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]中的最長增長序列 3>:確定dp數組的初始化 無論哪個數都是14>:確定dp數組的遍歷順序我們的dp[i]是比較其前面的幾個數的最大值的遍歷i在外層 j在內層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>:舉例驗證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 //關于這里的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開始 因為我們的是要計算從[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;} };總結
以上是生活随笔為你收集整理的leetcode300. 最长递增子序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机自动点击器教程
- 下一篇: leetcode674. 最长连续递增序