LeetCode #888. Fair Candy Swap
题目
解题方法
首先计算出A和B分别的和,并把B设置为一个集合,目的是为了循环中使用O(1)的in运算。遍历A中每一个元素x,如果 x + (sumB - sumA) / 2 在集合B中,则返回 x 和 x + (sumB - sumA) / 2,分别为ans[0]和ans[1]。
这是因为根据题意 sumA - x + y = sumB - y + x 恒成立,可以推断 y = x + (sumB - sumA) / 2 ,所以只要在B中找到这么一个y就可以了。
时间复杂度:O(n)
空间复杂度:O(n)
代码
class Solution:
def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
sumA, sumB = sum(A), sum(B)
setB = set(B)
for x in A:
if x + (sumB - sumA) // 2 in setB:
return [x, x + (sumB - sumA) // 2]