当且仅当 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)$