這個問題的描述簡單地說:
給定一個整數數組 nums,傳回最長嚴格遞增子序列.
的長度
例如:
或:
或:
與本系列的上一個問題類似,我們也可以在這裡看看自下而上的動態規劃方法。
對於 nums 陣列中的每個值,我們可以從索引開始的最大子序列的長度
我我我
我
1
(該值本身)
- 或
i 1 1i 1 i 1 i 1
i 1
i 1
i 1
i 1
i 1
我
1
。
但是,如果 nums[i 1] 小於 nums[i],我們不能包含第二個選項。
首先,我們可以先建立一個 dp 陣列來保存從 nums 的每個索引開始可以擁有的子序列的長度。也就是說,dp[0] 的長度是從 nums[0] 開始的最大子序列的長度,dp[1] 的長度是從 nums[1] 開始的最大子序列的長度,等等於:
然後,我們可以從 nums 的最後一個索引開始向後迭代(因為這是最簡單的位置,只有一種方法可以向前形成子序列,只需取值本身):
對於每個選項,我們可以從下一個索引開始迭代,看看是否可以包含從該索引開始可以形成的最大子序列,如果可以,我們可以得到dp[i] 和1 dp[ 之間的最大值j]:
最後,我們可以回到 dp 中的最大值:
最終的解如下:
時間和空間複雜度
時間複雜度為
22 🎜>)O(n ^2) O(n2
)(n)n
)
O(n🎜> O(n)
因為我們保留了一個 dp 數組,它的大小會隨著 nums 長度的增加而增加。
這是本系列中的最後一個動態規劃問題。接下來,我們將開始關於間隔的新章節。在那之前,祝您編碼愉快。
以上是LeetCode冥想:最長遞增子序列的詳細內容。更多資訊請關注PHP中文網其他相關文章!