當且僅當 arr 滿足以下條件時,我們將 arr 定義為山峰陣列:
arr.length >= 3
有乙個下標 i(從 0 開始),滿足 0 < i < arr長度 - 1 和:
arr[0] arr[i] >arr[i + 1] >arr[arr.length - 1]
給定乙個整數陣列 nums,請返回將 nums 刪除到山形陣列中的最小次數。
示例 1:輸入:nums = [1,3,1]。
輸出:0 解釋:陣列本身是乙個山峰陣列,所以我們不需要刪除任何元素。
示例 2:輸入:nums = [2,1,1,5,6,2,3,1]。
輸出:3 解釋:一種方法是去掉下標為 0,1 和 5 的元素,剩下的元素是 [1,5,6,3,1],即山陣列。
示例 3:輸入:nums = [4,3,2,1,1,2,3,1]。
輸出:4 個提示:
輸入:nums = [1,2,3,4,4,3,2,1]。
輸出: 1 提示:
3 <= nums.length <= 1000
1 <= nums[i] <= 109
該問題保證了 nums 在刪除某些元素後將獲得山陣列。
最長的公升序子序列檢視資料範圍3 <= nums.length <= 1000
。魯莽也沒問題。
這個問題要求你了解最長的公升序子序列。
有了這樣的知識前提,我們就可以列舉出所有的山頂。 所以。
左側需要刪除的專案數實際上是 l - lis left,其中 l 是左側的長度,lis left 是左側最長的公升序子序列的長度。 右側需要刪除的專案數量實際上是 r - lds right,其中 r 是右側的長度,lds right 是右側最長的降序子序列的長度。 為了統一邏輯最長的公升序子序列長度,我們可以將 R 翻轉一次。
列舉峰會的時間複雜度為 $o(n)$,常規 LIS 複雜度為 $o(n2)$。
基於時間複雜度的備忘單:
時間複雜度備忘單可以在我的刷牙外掛程式中找到。 刷牙外掛程式可以在我的***力扣加加“回覆外掛程式中獲得。此問題的資料範圍為 < = 1000。 因此,$n 3$ 不能傳遞。 但是,我們可以使用貪婪的 lis,它的時間複雜度為 $n 2logn$,這幾乎是勉強通過的。 關於貪婪的解決方案,在上面的文章中也提到了。
* 支援:python3
python3 code:
class solution: def minimummountainremovals(self, nums: list[int]) int: n = len(nums) ans = n def lis(a): d = for a in a: i = bisect.如果我< len(d),則將 left(d, a) 平分:d[i] = a elif 而不是 d 或 d[-1],因此 n 是陣列的長度。
時間複雜度:$o(n 2logn)$Space複雜度:$o(n)$