leetcode 300 最長遞增子串行 動態規劃

2021-10-14 04:45:16 字數 1455 閱讀 6730

300 最長遞增子串行

想弄明白動態規劃建議看大佬的筆記 演算法書籍分享

class

solution

intlengthoflis

(vector<

int>

& nums)

int res=dp[0]

;for

(int i =

1;i++i)

} res=

max(res,dp[i]);

}return res;}}

;

大大的重點,核心的東西
維護乙個結果陣列,如果當前元素比結果陣列的值都大的的話,就追加在結果陣列後面(相當於遞增序列長度加了1);否則的話用當前元素覆蓋掉第乙個比它大的元素(這樣做的話後續遞增序列才有可能更長,即使並沒有更長,這個覆蓋操作也並沒有***哈,當然這個覆蓋操作可能會讓最終的結果陣列值並不是最終的遞增序列值,這無所謂)

class

solution

int n = nums.

size()

; vector<

int> dp;

for(

int i =

0; i < n; i++

)else

}return dp.

size()

;}};

lower_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第乙個大於或等於num的數字,找到返回該數字的位址,不存在則返回end。通過返回的位址減去起始位址begin,得到找到數字在陣列中的下標。

upper_bound( begin,end,num):從陣列的begin位置到end-1位置二分查詢第乙個大於num的數字,找到返回該數字的位址,不存在則返回end。通過返回的位址減去起始位址begin,得到找到數字在陣列中的下標。

他倆的返回值是乙個迭代器指標,所以可以用*取內容

upper_bound返回乙個迭代器指標,指向第乙個大於val值的位置。如果沒有元素大於val,則返回last。

lower_bound返回乙個迭代器指標,指向第乙個大於等於val值的位置。如果沒有元素大於等於val(所有元素都小於val),則返回last。

這相當於把迭代器指標轉換成了陣列索引的形式

class

solution

int n = nums.

size()

; vector<

int> dp;

for(

int i =

0; i < n; i++

)else

}return dp.

size()

;}};

LeetCode 300 最長遞增子串行

300.最長遞增子串行 我們記狀態 dp i dp i dp i 表示以第 i ii 個元素結尾的最長上公升子串行的長度,那麼專一方程就可以定義為 dp i m ax d p j 1 0 j ndnu ms j ms i dp i max dp j 1 0 leq jdp i max dp j 1 ...

LeetCode300 最長遞增子串行

題目鏈結 題目描述 給你乙個整數陣列 nums 找到其中最長嚴格遞增子串行的長度。子串行是由陣列派生而來的序列,刪除 或不刪除 陣列中的元素而不改變其餘元素的順序。例如,3,6,2,7 是陣列 0,3,1,6,2,2,7 的子串行。示例 輸入 nums 10,9,2,5,3,7,101,18 輸出 ...

leetcode 300 最長遞增子串行

思路,動態規劃 狀態含義 dp i 第i個元素所表示的最大的遞增序列長度 轉移方程 第i個是否可以放在第j個後面 1.可以放,dp i max dp i dp j 1 2.不可以放,跳過 遍歷dp找最大 class solution max max max,dp i return max inclu...