https://leetcode.cn/problems/minimum-operations-to-make-array-equal-to-target/description/
给你两个长度相同的正整数数组 nums
和 target
。
在一次操作中,你可以选择 nums
的任何
返回使 nums
数组变为 target
数组所需的 最少 操作次数。
示例 1:
输入: nums = [3,5,1,2], target = [4,6,2,4]
输出: 2
解释:
执行以下操作可以使 nums
等于 target
:
- nums[0..3]
增加 1,nums = [4,6,2,3]
。
- nums[3..3]
增加 1,nums = [4,6,2,4]
。
示例 2:
输入: nums = [1,3,2], target = [2,1,4]
输出: 5
解释:
执行以下操作可以使 nums
等于 target
:
- nums[0..0]
增加 1,nums = [2,3,2]
。
- nums[1..1]
减少 1,nums = [2,2,2]
。
- nums[1..1]
减少 1,nums = [2,1,2]
。
- nums[2..2]
增加 1,nums = [2,1,3]
。
- nums[2..2]
增加 1,nums = [2,1,4]
。
提示:
1 <= nums.length == target.length <= 105
1 <= nums[i], target[i] <= 108
- 暂无
这道题是 1526. 形成目标数组的子数组最少增加次数 的进阶版。我们的操作不仅可以 + 1, 也可以 - 1。
如果大家没有看过那篇题解的话,建议先看一下。后面的内容将会假设你看过那篇题解。
注意到我们仅关心 nums[i] 和 target[i] 的相对大小,且 nums 中的数相互独立。因此我们可以将差值记录到数组 diff 中,这样和 1526. 形成目标数组的子数组最少增加次数 更加一致。
前面那道题,数组没有负数。而我们生成的 diff 是可能为正数和负数的。这会有什么不同吗?
不妨考虑 diff[i] > 0 且 diff[i+1] < 0。我们的操作会横跨 i 和 i + 1 么?答案是不会,因为这两个操作相比从i断开,直接再操作 diff[i+1]次不会使得总的结果更优。因此我们不妨就再变号的时候重新开始一段。
另外就是一个小小的细节。diff[i] 和diff[i+1] 都是负数的时候,如果:
- diff[i] <= diff[i+1] 意味着 diff[i+1] 可以顺便改了
- diff[i] > diff[i+1] 意味着 diff[i+1] 需要再操作 diff[i] - diff[i+1]
这个判断和 diff[i] > 0 且 diff[i+1] 的时候完全是反的。我们可以通过取绝对值来统一逻辑,使得代码更加简洁。
至于其他的,基本就和上面的题目一样了。
- 考虑修改的左右端点
- 正负交替的情况,可以直接新开一段
- 语言支持:Python3
Python3 Code:
class Solution:
def minimumOperations(self, nums: List[int], target: List[int]) -> int:
diff = []
for i in range(len(nums)):
diff.append(nums[i] - target[i])
ans = abs(diff[0])
for i in range(1, len(nums)):
if diff[i] * diff[i - 1] >= 0: # 符号相同,可以贪心地复用
if abs(diff[i]) > abs(diff[i - 1]): # 这种情况,说明前面不能顺便把我改了,还需要我操作一次
ans += abs(diff[i]) - abs(diff[i - 1])
else: # 符号不同,不可以复用,必须重新开启一段
ans += abs(diff[i])
return ans
复杂度分析
令 n 为数组长度。
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
此题解由 力扣刷题插件 自动生成。
力扣的小伙伴可以关注我,这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 54K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。