給你乙個整數陣列 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...