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 (0≤j ndnu ms[j ]ms[i ]) solution return *max_element (dp. begin() , dp. end()) ;}};詳細參考 官方題解 講真,最早最早想到這個演算法的人吼,腦迴路確實不是一般人。 先來說他是咋想的哈,我們要讓上公升子串行盡可能長,那麼上公升子串行一定不能上公升得太快,也就是說右端點值不能一上來就很大很大。那麼,貪心就體現在每次增長時在子串行最末尾新增的元素要盡可能小。 我們記乙個 d[l en ]d[len] d[len] 來表示長度為 len lenle n 的上公升子串行的末尾元素值。 易知的是,d[l en ]d[len] d[len] 關於 len lenle n 單調遞增。有單調性我們就知道怎麼出來的二分法了。 如果n um s[i] >d[ len] nums[i]>d[len] nums[i ]>d[ len] ,就說明我們這時在 d[. .. ]d[...] d[...] 的末尾插入 num s[i] nums[i] nums[i ] 是合理的,保證上公升性的同時增加了長度。 如果n um s[i] len] nums[i]nu ms[i ]len] 呢 ?通過上面的描述,我們知道 num s[i] nums[i] nums[i ] 是有用的,它保證了這個子串行不會上公升很快。但是我們應該把它放哪兒呢?插入到最後是不合適的,這樣違背了上公升性。於是,我們對 d[. .. ]d[...] d[...] 做二分查詢,找到乙個 num s[i] nums[i] nums[i ] 可以插進去的地方,這個位置必然滿足 d[p os ] ms[i ] pos+ 1] d[pos]d[ pos] ms[i ]pos+ 1],這樣我們就將 num s[i] nums[i] nums[i ]插入到 pos +1 pos+1 pos+ 1 的位置,也就是說我們以 num s[i] nums[i] nums[i ] 結尾的子串行長度為 pos +1 pos+1 pos+ 1,這樣做既保證了最長上公升子串行的要求,也滿足了我們希望它上公升得慢一些的要求 以輸入序列 第一步插入 0, 第二步插入 8, 第三步插入 4, 第四步插入 12, 第五步插入 2, 最終得到最大遞增子串行長度為 3 solution else right = mid-1; } d[pos+1] = nums[i];} }return len;}} ;耐心排序求最大上公升子串行也是腦迴路非一般人, 但是總的和解法二是很相近的,只是在解法二的基礎再深了一點點 (@_@ ; ) 我們先講啥是耐心排序 假設數列是一組牌,每次都抽取一張,按規則放置,最後形成幾組牌 規則是: 假設數列是 每次放置牌時,組的結果如下: 初始化 第一步插入 0, 第二步插入 8, 第三步插入 4, 第四步插入 12, 第五步插入 2, 一共 3 組,取每個組的第乙個數形成 編碼具體內容就不給出了,耐心排序的編碼實現和解法二是一樣的,只是在耐心排序中我們選擇將每個較大元素單獨設定成乙個組,而不是直接插入末尾 題目鏈結 題目描述 給你乙個整數陣列 nums 找到其中最長嚴格遞增子串行的長度。子串行是由陣列派生而來的序列,刪除 或不刪除 陣列中的元素而不改變其餘元素的順序。例如,3,6,2,7 是陣列 0,3,1,6,2,2,7 的子串行。示例 輸入 nums 10,9,2,5,3,7,101,18 輸出 ... 思路,動態規劃 狀態含義 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... 給你乙個整數陣列 nums 找到其中最長嚴格遞增子串行的長度。子串行是由陣列派生而來的序列,刪除 或不刪除 陣列中的元素而不改變其餘元素的順序。例如,3,6,2,7 是陣列 0,3,1,6,2,2,7 的子串行。示例 1 輸入 nums 10,9,2,5,3,7,101,18 輸出 4 解釋 最長遞...class
[0, 8, 4, 12, 2]
為例:d = [0]
d = [0, 8]
d = [0, 4]
d = [0, 4, 12]
d = [0, 2, 12]
class
[0, 8, 4, 12, 2]
[ ]
[ [0] ]
[ [0], [8] ]
[ [0], [8, 4]]
[ [0], [8, 4], [12]]
[ [0], [8, 4, 2], [12]]
[0, 8, 12]
,這是該數列的最長上公升子串行LeetCode300 最長遞增子串行
leetcode 300 最長遞增子串行
LeetCode 300 最長遞增子串行