爱丽丝和鲍勃有不同大小的糖果棒:A[i]
是爱丽丝拥有的第 i
根糖果棒的大小,B[j]
是鲍勃拥有的第 j
根糖果棒的大小。
因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans
,其中 ans[0]
是爱丽丝必须交换的糖果棒的大小,ans[1]
是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。
不知道为啥这道题最后给了一条 "答案肯定存在" 的提示, 因为没有答案的这完全可以用来判断并不会增加很多难度, 我下面的仍然当做没有这条限制来做的
第一版代码: 这是看到这道题后的直观理解, 直接猜着写的, 没想到直接就通过了, 下面的第二个版本写一下解释
class Solution:
def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
suma = sum(A)
sumb = sum(B)
margin = suma - sumb
for a in A:
if a - int(margin/2) in B:
return [a, int(a-margin/2)]
第二版代码:我们用Sa表示A中各数据的和, Sb表示B中各数据的和, 如果存在a, b能够使得他们交换后相等, 那么肯定有下面的等式成立
化简后得到: a - b = (Sa - Sb) / 2
因为数组中都是整数, 所以Sa - Sb的结果肯定是偶数, 如果不是偶数那么就没有结果, 直接返回None或者空列表
如果是偶数, 那么只要a,b的差符合(Sa - Sb)/2 那么直接返回即可
class Solution:
def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
margin = sum(A) - sum(B)
if margin % 2 == 1:
return None
mi = margin // 2
bset = set(B)
for a in A:
if a - mi in bset:
return [a, a - mi]
看了排名靠前大佬的答案, 差不多也都是这样解答的. 但是因为他们考虑到了肯定是有答案的, 所以并没有判断差是奇数的情况