公平的糖果交换
难度:
标签:
题目描述
代码结果
运行时间: 55 ms, 内存: 17.9 MB
/*
* 思路:
* 1. 计算爱丽丝和鲍勃各自的糖果总数。
* 2. 计算需要交换的糖果数目差 diff = (aliceSum - bobSum) / 2。
* 3. 用一个集合来存储爱丽丝所有糖果的数目。
* 4. 使用 Java Stream 遍历鲍勃的糖果数目,检查是否存在爱丽丝的糖果数目满足 aliceCandy - bobCandy = diff。
* 5. 找到符合条件的糖果数目,返回结果。
*/
import java.util.*;
import java.util.stream.*;
public class CandySwapStream {
public int[] fairCandySwap(int[] aliceSizes, int[] bobSizes) {
int aliceSum = Arrays.stream(aliceSizes).sum();
int bobSum = Arrays.stream(bobSizes).sum();
int diff = (aliceSum - bobSum) / 2;
Set<Integer> aliceSet = Arrays.stream(aliceSizes).boxed().collect(Collectors.toSet());
return Arrays.stream(bobSizes)
.filter(candy -> aliceSet.contains(candy + diff))
.mapToObj(candy -> new int[]{candy + diff, candy})
.findFirst()
.orElse(new int[0]); // 实际上这里不会到达,题目保证有答案
}
}
解释
方法:
题解的思路是通过找到一个公式来确定爱丽丝和鲍勃需要交换的糖果盒数量,使得交换后两人的糖果总量相等。首先计算出爱丽丝和鲍勃各自糖果的总数量sumA和sumB。通过计算delta = (sumA - sumB) / 2,得到爱丽丝需要比鲍勃多交换的糖果数量。通过遍历鲍勃的糖果数组,查找一个糖果数b,使得a = b + delta存在于爱丽丝的糖果集合中,即找到一个满足条件的(a, b)对,返回这个对即为答案。
时间复杂度:
O(m + n)
空间复杂度:
O(m)
代码细节讲解
🦆
为什么题解中的delta使用的是(sumA - sumB) // 2来计算,这样的计算逻辑是基于什么理论或者规则?
▷🦆
在查找满足条件的(a, b)对时,为什么优先遍历bobSizes而不是aliceSizes,这样的选择对算法的效率有什么影响?
▷🦆
如果aliceSizes和bobSizes中有重复的糖果数,会对算法的输出结果产生什么样的影响?
▷🦆
题解中使用了整数除法//来计算delta,如果sumA和sumB的差是奇数会发生什么?题目是否保证了sumA和sumB的差总是偶数?
▷