题目描述
爱丽丝和鲍勃有不同大小的糖果棒:A[i]
是爱丽丝拥有的第 i
块糖的大小,B[j]
是鲍勃拥有的第 j
块糖的大小。
因为他们是朋友,所以他们想交换一个糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans
,其中 ans[0]
是爱丽丝必须交换的糖果棒的大小,ans[1]
是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。
示例
输入:A = [1, 1], B = [2, 2]
输出:[1, 2]
输入:A = [1, 2], B = [2, 3]
输出:[1, 2]
输入:A = [2], B = [1, 3]
输出:[2, 3]
输入:A = [1, 2, 5], B = [2, 4]
输出:[5, 4]
提示
- 1 <= A.length <= 10000
- 1 <= B.length <= 10000
- 1 <= A[i] <= 100000
- 1 <= B[i] <= 100000
- 保证起始状态爱丽丝与鲍勃的糖果总量不同。
- 答案肯定存在。
解题思路
本题题干中已说明,答案肯定存在,故可以采用暴力检索吧,但有没有更好的方案呢?答案是有的。
因为两个人糖果总量不同,也就意味着A和B各元素之和不相同,首先,我们定义两个变量sumA和sumB存放两个数组的元素之和,在遍历B数组时,提前定义一个hashset(这就是将暴力转化最为关键的一步),然后将B中的元素依次存入hashset中(无重复元素),之后再定义一个变量tmp = (sumA - sumB) / 2,遍历A数组,如果在hashset中包含a - tmp,则直接将a与a - tmp拼入数组直接返回即可。
代码
public int[] fairCandySwap(int[] A, int[] B) {
HashSet<Integer> hashSet = new HashSet<>();
int sumA = 0, sumB = 0;
for (int a : A) sumA += a;
for (int b : B) {
hashSet.add(b);
sumB += b;
}
int tmp = (sumA - sumB) / 2;
for (int a : A) {
if (hashSet.contains(a - tmp)) {
return new int[]{a, a - tmp};
}
}
return null;
}
执行结果
欢迎各位大神指点