Leetcode 300 最長遞增子串行

2021-10-21 00:27:50 字數 2166 閱讀 5156

給你乙個整數陣列 nums ,找到其中最長嚴格遞增子串行的長度。

子串行是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子串行。

輸入:nums = [10,9,2,5,3,7,101,18]

輸出:4

解釋:最長遞增子串行是 [2,3,7,101],因此長度為 4 。

輸入:nums = [0,1,0,3,2,3]

輸出:4

輸入:nums = [7,7,7,7,7,7,7]

輸出:1

1 <= nums.length <= 2500

-104 <= nums[i] <= 104

你可以設計時間複雜度為 o(n2) 的解決方案嗎?

你能將演算法的時間複雜度降低到 o(n log(n)) 嗎?

考慮使用動態規劃,從第一位開始,分別記錄位置 i 之前的最長遞增子串行,在其後 j 位置上,如果數值比 i 位數值要大,則 j 位置的元素可以接在 i 後方,子串行長度為 i 的子串行長度加一,**如下:

class

solution

if(dp[i]

>max)

max=dp[i];}

return max;}}

;

**執行效果一般

根據題目高階要求時間複雜度降低到 o(n log(n)) ,看題解學習更優解法

官解提出使用貪心+二分查詢的解法,內容如下:

考慮乙個簡單的貪心,如果我們要使上公升子串行盡可能的長,則我們需要讓序列上公升得盡可能慢,因此我們希望每次在上公升子串行最後加上的那個數盡可能的小。

基於上面的貪心思路,我們維護乙個陣列 d[i]d[i] ,表示長度為 ii 的最長上公升子串行的末尾元素的最小值,用 \textitlen 記錄目前最長上公升子串行的長度,起始時 lenlen 為 11,d[1] = \textit[0]d[1]=nums[0]。

同時我們可以注意到 d[i]d[i] 是關於 ii 單調遞增的。因為如果 d[j] \geq d[i]d[j]≥d[i] 且 j < ij我們依次遍歷陣列 \textitnums 中的每個元素,並更新陣列 dd 和 lenlen 的值。如果 \textit[i] > d[\textit]nums[i]>d[len] 則更新 len = len + 1len=len+1,否則在 d[1 \ldots len]d[1…len]中找滿足 d[i - 1] < \textit[j] < d[i]d[i−1]根據 dd 陣列的單調性,我們可以使用二分查詢尋找下標 ii,優化時間複雜度。

最後整個演算法流程為:

設當前已求出的最長上公升子串行的長度為 \textitlen(初始時為 11),從前往後遍歷陣列 \textitnums,在遍歷到 \textit[i]nums[i] 時:

如果 \textit[i] > d[\textit]nums[i]>d[len] ,則直接加入到 dd 陣列末尾,並更新 \textit = \textit + 1len=len+1;

否則,在 dd 陣列中二分查詢,找到第乙個比 \textit[i]nums[i] 小的數 d[k]d[k] ,並更新 d[k + 1] = \textit[i]d[k+1]=nums[i]。

以輸入序列 [0, 8, 4, 12, 2][0,8,4,12,2] 為例:

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

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

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

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

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

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

**如下:

class

solution

else

} d[pos +1]

= nums[i];}

}return len;}}

;

**執行效果較好

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