链接
题目
给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。
返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。
示例
示例1:
输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]
输出: [1, 3]示例2:
输入: array1 = [1, 2, 3], array2 = [4, 5, 6]
输出: []
说明
1 <= array1.length, array2.length <= 100000
思路
题目要求两个数组互相交换一个数之后,两数组的和相等,假设两个数组原本的和相差为a,那么交换的两个数应该要相差a/2,才能使得交换后两数组的和相等。
因为数组中所有的数都为整数,所以如果a为奇数,那么肯定不存在这么两个数,只有当a为偶数的时候才有可能存在。
我们可以对两个数组分别求和,求出这个a,然后遍历两个数组,寻找是否存在相差a/2的两个数。
C++ Code
class Solution {
public:
vector<int> findSwapValues(vector<int>& array1, vector<int>& array2) {
int sum1=0,sum2=0;
for(int n:array1) sum1+=n;
for(int n:array2) sum2+=n;
if((sum1-sum2)%2!=0) return{};
int diff=(sum1-sum2)/2;
for(int n:array1)
{
for(int m:array2)
{
if(n-m==diff)
return {n,m};
}
}
return {};
}
};
以上代码过于暴力,会超时,因此我们可以考虑用空间换时间。
class Solution {
public:
vector<int> findSwapValues(vector<int>& array1, vector<int>& array2) {
int sum1=0,sum2=0;
unordered_map<int,int> map;
for(int n:array1) sum1+=n;
for(int n:array2) {sum2+=n; map[n]++;}
if((sum1-sum2)%2!=0) return{};
int diff=(sum1-sum2)/2;
for(int n:array1)
{
if (map.find(n-diff)!=map.end())
return {n,n-diff};
}
return {};
}
};