https://leetcode-cn.com/problems/fair-candy-swap/
思路:看数据范围知道暴力枚举是不行滴,先转化问题,不妨设
s
u
m
A
=
∑
i
=
0
n
A
i
sumA=\sum_{i=0}^nA_i
sumA=∑i=0nAi,
s
u
m
=
s
u
m
A
+
∑
i
=
0
m
B
i
sum=sumA+\sum_{i=0}^mB_i
sum=sumA+∑i=0mBi,那么此时我们枚举
i
i
i,假设爱丽丝需要交换的糖果数是
A
[
i
]
A[i]
A[i],那么显然要存在一个
j
j
j,使得下式成立:
s
u
m
A
−
A
[
i
]
+
B
[
j
]
=
s
u
m
/
2
sumA-A[i]+B[j]=sum/2
sumA−A[i]+B[j]=sum/2
由此可知:
B
[
j
]
=
s
u
m
/
2
−
s
u
m
A
+
A
[
i
]
B[j]=sum/2-sumA+A[i]
B[j]=sum/2−sumA+A[i]
也就是说对于每个
i
i
i,只需要判断数组
B
B
B中是否存在
s
u
m
/
2
−
s
u
m
A
+
A
[
i
]
sum/2-sumA+A[i]
sum/2−sumA+A[i]这个数即可,那么有什么数据结构可以快速做到这一点呢?当然是哈希表了。
class Solution {
public:
vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
map<int,bool> m;
int sum=0,sumA=0,n=A.size();
for(int i=0;i<n;i++)
sum+=A[i];
sumA=sum;
n=B.size();
for(int i=0;i<n;i++)
sum+=B[i],m[B[i]]=1;
sum>>=1;
auto it=m.end();
n=A.size();
for(int i=0;i<n;i++)
{
if(m.find(sum-sumA+A[i])!=it)
return {A[i],sum-sumA+A[i]};
}
return {0,0};
}
};