
2026-07-06:通过交换使数组相等的最小花费。用go语言,给你两个长度均为 n 的整数数组 nums1 和 nums2。
你可以执行以下操作任意次:
1.同数组内交换(免费)
在同一个数组中任选两个位置 i 和 j,把该位置上的元素互换;nums1 内换、或 nums2 内换都可以。此类操作不花费任何代价。
2.跨数组对应位置交换(费用为 1)
任选一个下标 i,将 nums1[i] 与 nums2[i] 这两个位置的元素互换。每执行一次花费 1。
目标:让最终的 nums1 和 nums2 完全相同。
求完成该目标所需的最小总费用;如果无法做到,返回 -1。
2 <= n == nums1.length == nums2.length <= 80000。
1 <= nums1[i], nums2[i] <= 80000。
输入: nums1 = [10,10], nums2 = [20,20]。
输出: 1。
解释:
交换 nums1[0] = 10 和 nums2[0] = 20。
nums1 变为 [20, 10]。
nums2 变为 [10, 20]。
此操作花费 1。
交换 nums2[0] = 10 和 nums2[1] = 20。
nums2 变为 [20, 10]。
此操作是免费的。
nums1 和 nums2 现在相同。花费为 1。
题目来自力扣3868。
调整完成后,nums1 的全部元素多重集合 = nums2 的全部元素多重集合。
把两个数组所有元素合并统计频次后,任意数字出现总次数为奇数 → 无法均分,直接返回 -1。
全部元素合并:10、10、20、20 总频次:10出现2次,20出现2次,全为偶数,有解。
整体思路:利用哈希表统计两个数组元素的差值,通过差值计算最少交换次数。
哈希表 key = 数字x,value = 差值d
diff[x] += 1
含义:该数字在nums1中比nums2多1个。diff[x] -= 1
含义:该数字在nums2中抵消一个nums1的计数。以示例代入计算:
逐个取出每个数字对应的差值d:
示例代入: diff[10]=2>0 → ans +=2;diff[20]=-2 不参与累加,此时ans=2。
ans是所有“nums1多出元素”的总数,每一次跨数组交换操作,能同时消除nums1一个多余元素、消除nums2一个多余元素: 每1次交换,能抵消2个多余计数(nums1少1个,nums2少1个)。 所以总交换次数 = 总多余数量 ÷ 2。
示例中ans=2,2/2=1,和题目输出完全匹配。
设数组长度为n:
哈希表diff存储所有出现过的数字; 最坏情况nums1、nums2全部数字互不重复,哈希表需要存储2n个键值对; 输入数组不计入额外空间,仅统计哈希表占用内存,额外空间复杂度:O(n)
.
package main
import (
"fmt"
)
func minCost(nums1, nums2 []int) (ans int) {
diff := map[int]int{}
for _, x := range nums1 {
diff[x]++
}
for _, x := range nums2 {
diff[x]--
}
for _, d := range diff {
if d%2 != 0 {
return-1
}
if d > 0 {
ans += d
}
}
return ans / 2
}
func main() {
nums1 := []int{10, 10}
nums2 := []int{20, 20}
result := minCost(nums1, nums2)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def minCost(nums1, nums2):
diff = {}
# 统计 nums1 的出现次数
for x in nums1:
diff[x] = diff.get(x, 0) + 1
# 减去 nums2 的出现次数
for x in nums2:
diff[x] = diff.get(x, 0) - 1
ans = 0
for d in diff.values():
# 如果某个数值的频次差为奇数,则无法匹配
if d % 2 != 0:
return-1
# 只累加正差值,最终结果除以 2
if d > 0:
ans += d
return ans // 2
if __name__ == "__main__":
nums1 = [10, 10]
nums2 = [20, 20]
result = minCost(nums1, nums2)
print(result)
.
#include <iostream>
#include <vector>
#include <unordered_map>
int minCost(const std::vector<int>& nums1, const std::vector<int>& nums2) {
std::unordered_map<int, int> diff;
for (int x : nums1) {
diff[x]++;
}
for (int x : nums2) {
diff[x]--;
}
int ans = 0;
for (const auto& p : diff) {
int d = p.second;
if (d % 2 != 0) {
return-1;
}
if (d > 0) {
ans += d;
}
}
return ans / 2;
}
int main() {
std::vector<int> nums1 = {10, 10};
std::vector<int> nums2 = {20, 20};
int result = minCost(nums1, nums2);
std::cout << result << std::endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·