LeetCode 300 最長遞增子串行

2021-10-06 03:53:26 字數 2974 閱讀 5291

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

])

class

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]為例:

第一步插入 0,d = [0]

第二步插入 8,d = [0, 8]

第三步插入 4,d = [0, 4]

第四步插入 12,d = [0, 4, 12]

第五步插入 2,d = [0, 2, 12]

最終得到最大遞增子串行長度為 3

class

solution

else right = mid-1;

} d[pos+1]

= nums[i];}

}return len;}}

;

耐心排序求最大上公升子串行也是腦迴路非一般人, 但是總的和解法二是很相近的,只是在解法二的基礎再深了一點點 (@_@ ; )

我們先講啥是耐心排序

假設數列是一組牌,每次都抽取一張,按規則放置,最後形成幾組牌

規則是:

假設數列是[0, 8, 4, 12, 2]

每次放置牌時,組的結果如下:

初始化[ ]

第一步插入 0,[ [0] ]

第二步插入 8,[ [0], [8] ]

第三步插入 4,[ [0], [8, 4]]

第四步插入 12,[ [0], [8, 4], [12]]

第五步插入 2,[ [0], [8, 4, 2], [12]]

一共 3 組,取每個組的第乙個數形成[0, 8, 12],這是該數列的最長上公升子串行

編碼具體內容就不給出了,耐心排序的編碼實現和解法二是一樣的,只是在耐心排序中我們選擇將每個較大元素單獨設定成乙個組,而不是直接插入末尾

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...

LeetCode 300 最長遞增子串行

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