十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

千问 LeetCode 3892. 产生至少 K 个峰值的最少操作次数 Python3实现

千问    LeetCode 3892. 产生至少 K 个峰值的最少操作次数 Python3实现 这道题的核心是环形打家劫舍 DP峰值不能相邻通过破环成链分两种情况处理环形约束再用滚动数组优化空间避免 MLE。核心思路1. 可行性判断环形数组中峰值不能相邻理论上限为 ⌊n/2⌋若 k n/2 直接返回 -12. 破环成链类似打家劫舍 II分两种情况覆盖所有环形合法方案- 情况 A假设首元素是峰值 → 尾元素不能是峰值构造 [nums[n-1], nums[0], ..., nums[n-1]]- 情况 B假设首元素不是峰值 → 构造 [nums[0], nums[1], ..., nums[n-1], nums[0]]3. 线性 DP在构造的数组上用滚动数组逐层递推选出 k 个不相邻峰值的最小代价4. 代价计算让 a[i] 成为峰值需使其严格大于左右邻居操作次数为 max(0, max(a[i-1], a[i1]) - a[i] 1)Python3 实现class Solution:INF float(inf)def _solve(self, a, k):线性版本在数组 a 中选出 k 个不相邻的峰值所需的最小操作数使用滚动数组优化空间n len(a)# f[i] 表示在子数组 a[0..i] 中选出当前层所需峰值的最小代价f [0] * nfor left in range(1, k 1):# f0 f[left*2-2], f1 f[left*2-1]上一层的结果f0 f[left * 2 - 2]f1 f[left * 2 - 1]f[left * 2 - 1] self.INF # 当前位置初始化为正无穷# end 剪枝后面至少要留 (k-left)*2 个位置给剩余峰值end n - 1 - (k - left) * 2for i in range(left * 2 - 1, end):not_choose f[i] # 不选 a[i] 作为峰值# 选 a[i] 作为峰值的代价需严格大于左右邻居cost max(0, max(a[i - 1], a[i 1]) - a[i] 1)choose f0 costf0 f1f1 f[i 1] # 保存旧数据供下一轮使用f[i 1] min(not_choose, choose)return f[n - 1]def minOperations(self, nums: list[int], k: int) - int:n len(nums)# 峰值不能相邻最多 n//2 个if k n // 2:return -1# 统计已有峰值个数cnt 0for i in range(n):prev_val nums[(i - 1 n) % n]next_val nums[(i 1) % n]if nums[i] prev_val and nums[i] next_val:cnt 1if cnt k:return 0 # 已满足要求# 情况 A首元素是峰值 → 尾元素不能是峰值# 构造 [nums[n-1], nums[0], nums[1], ..., nums[n-1]]a1 [nums[n - 1]] nums[:]ans1 self._solve(a1, k)# 情况 B首元素不是峰值# 构造 [nums[0], nums[1], ..., nums[n-1], nums[0]]a2 nums[:] [nums[0]]ans2 self._solve(a2, k)return min(ans1, ans2)关键点解析- 破环成链两种构造方式确保覆盖所有环形合法方案——首尾不能同时为峰值至少有一个不是峰值- 滚动数组f 数组复用f0/f1 保存上一层旧值避免 dp[i][j] 二维数组导致 MLEn5000 时二维数组开销大- 剪枝end n - 1 - (k - left) * 2 保证剩余位置足够放下剩余峰值每个峰值至少隔一个位置- 时间复杂度O(nk)空间复杂度O(n)示例验证以 nums [2,1,2], k 1 为例- k1 ≤ 3//21可行- 已有峰值无2 不大于相邻的 2cnt0 1- 情况 Aa1 [2,2,1,2]solve 选出 1 个峰值最小代价 1- 情况 Ba2 [2,1,2,2]solve 选出 1 个峰值最小代价 1- 返回 min(1,1) 1 ✓这道题最大的坑是卡常和 MLE二维 DP 容易超时/超内存滚动数组优化是过题关键。需要我帮你整理一份环形打家劫舍类题目的通用模板吗
返回列表