3810. 变成目标数组的最少操作次数
February 5, 2026 · View on GitHub
题目描述
给你两个长度为 n 的整数数组 nums 和 target,其中 nums[i] 是下标 i 处的当前值,而 target[i] 是下标 i 处的期望值。
你可以执行以下操作任意次数(包括零次):
- 选择一个整数值
x - 找到所有 极大连续段,使得
nums[i] == x(如果一个段在保持所有值等于x的情况下无法向左或向右延伸,则该段是 极大 的) - 对于每个这样的段
[l, r],同时 进行更新:nums[l] = target[l], nums[l + 1] = target[l + 1], ..., nums[r] = target[r]
返回使 nums 等于 target 所需的 最小 操作次数。
示例 1:
输入: nums = [1,2,3], target = [2,1,3]
输出: 2
解释:
- 选择
x = 1:极大段[0, 0]被更新 -> nums 变为[2, 2, 3] - 选择
x = 2:极大段[0, 1]被更新(nums[0]保持为 2,nums[1]变为 1) ->nums变为[2, 1, 3] - 因此,将
nums转换为target需要 2 次操作。
示例 2:
输入: nums = [4,1,4], target = [5,1,4]
输出: 1
解释:
- 选择
x = 4:极大段[0, 0]和[2, 2]被更新(nums[2]保持为 4) ->nums变为[5, 1, 4] - 因此,将
nums转换为target需要 1 次操作。
示例 3:
输入: nums = [7,3,7], target = [5,5,9]
输出: 2
解释:
- 选择
x = 7:极大段[0, 0]和[2, 2]被更新 ->nums变为[5, 3, 9] - 选择
x = 3:极大段[1, 1]被更新 ->nums变为[5, 5, 9] - 因此,将
nums转换为target需要 2 次操作。
提示:
1 <= n == nums.length == target.length <= 1051 <= nums[i], target[i] <= 105
解法
方法一:哈希表
根据题目描述,我们只需要统计 的不同 的个数即可。因此,我们可以使用哈希表来存储这些不同的 ,最后返回哈希表的大小即可。
时间复杂度 ,空间复杂度 。其中 是数组的长度。
Python3
class Solution:
def minOperations(self, nums: List[int], target: List[int]) -> int:
s = {x for x, y in zip(nums, target) if x != y}
return len(s)
Java
class Solution {
public int minOperations(int[] nums, int[] target) {
Set<Integer> s = new HashSet<>();
for (int i = 0; i < nums.length; ++i) {
if (nums[i] != target[i]) {
s.add(nums[i]);
}
}
return s.size();
}
}
C++
class Solution {
public:
int minOperations(vector<int>& nums, vector<int>& target) {
unordered_set<int> s;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] != target[i]) {
s.insert(nums[i]);
}
}
return s.size();
}
};
Go
func minOperations(nums []int, target []int) int {
s := make(map[int]struct{})
for i := 0; i < len(nums); i++ {
if nums[i] != target[i] {
s[nums[i]] = struct{}{}
}
}
return len(s)
}
TypeScript
function minOperations(nums: number[], target: number[]): number {
const s = new Set<number>();
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== target[i]) {
s.add(nums[i]);
}
}
return s.size;
}