
2026-05-21:变成目标数组的最少操作次数。用go语言,给你两个长度为 n 的整数数组 nums 和 target。nums[i] 表示当前位置 i 的当前值,target[i] 表示你希望当前位置 i 最终变成的期望值。
你可以进行任意多次操作(可以不做)。每次操作你要先选定一个整数 x,然后在数组 nums 里找出所有“极大连续区间”:这些区间里的每个位置都等于 x,且该区间在保持全为 x 的前提下,不能再向左或向右扩展(也就是已经是该值 x 的最长连续段,并且是无法再延伸的那种)。
对每个这样的区间 [l, r],本次操作会把这个区间内的 nums 全部替换成 target 对应位置的值:
把 nums[l..r] 直接改成 target[l..r]。
你的目标是让最终 nums 完全等于 target,问最少需要多少次操作。
1 <= n == nums.length == target.length <= 100000。
1 <= nums[i], target[i] <= 100000。
输入: 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 次操作。
题目来自力扣3810。
[1, 2, 3][2, 1, 3][0, 0]。[2, 2, 3][2, 1, 3][0, 1]。[2, 1, 3][2, 1, 3]此时 nums 与 target 完全相等,停止操作。
最终最少操作次数:2
nums[i] ≠ target[i] 的位置,这些位置是必须通过操作修正的。n,哈希表的单次操作是 O(1) 常数时间。n(极端情况所有位置都需要修正,且数值全不同)。.
package main
import (
"fmt"
)
func minOperations(nums, target []int)int {
set := map[int]struct{}{}
for i, x := range nums {
if x != target[i] {
set[x] = struct{}{}
}
}
returnlen(set)
}
func main() {
nums := []int{1, 2, 3}
target := []int{2, 1, 3}
result := minOperations(nums, target)
fmt.Println(result)
}

.
package main
import (
"fmt"
)
func minOperations(nums, target []int)int {
set := map[int]struct{}{}
for i, x := range nums {
if x != target[i] {
set[x] = struct{}{}
}
}
returnlen(set)
}
func main() {
nums := []int{1, 2, 3}
target := []int{2, 1, 3}
result := minOperations(nums, target)
fmt.Println(result)
}

.
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int minOperations(vector<int>& nums, vector<int>& target) {
unordered_set<int> set;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != target[i]) {
set.insert(nums[i]);
}
}
return set.size();
}
int main() {
vector<int> nums = {1, 2, 3};
vector<int> target = {2, 1, 3};
int result = minOperations(nums, target);
cout << result << endl;
return0;
}
