原题指路
公平的糖果棒交换
题目描述
爱丽丝和鲍勃有不同大小的糖果棒:A[i]
是爱丽丝拥有的第 i
根糖果棒的大小,B[j]
是鲍勃拥有的第 j
根糖果棒的大小。
因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans
,其中 ans[0]
是爱丽丝必须交换的糖果棒的大小,ans[1]
是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。
解题思路
今天第一次用Python写了一次题,感觉很棒!
1、首先本题需要明确其答案的数学关系:
若存在答案
(
x
,
y
)
(x,y)
(x,y)(题目已保证存在),则满足关系式
s
u
m
(
A
)
−
x
+
y
=
s
u
m
(
B
)
+
x
−
y
sum(A)−x+y=sum(B)+x−y
sum(A)−x+y=sum(B)+x−y,进一步可得出:
x
=
y
+
sumA
−
sumB
2
x = y + \frac{\textit{sumA} - \textit{sumB}}{2}
x=y+2sumA−sumB,设
d
i
f
=
sumA
−
sumB
2
dif = \frac{\textit{sumA} - \textit{sumB}}{2}
dif=2sumA−sumB,则
x
−
d
i
f
=
y
x-dif=y
x−dif=y。
2、其次,为提高程序的效率(防止因二次遍历导致时间复杂度过高)这里采用Python里的字典(实现方法其实就是hash)这种数据结构来存储B中的数据。
时间复杂度:
O
(
N
a
)
O(N_{a})
O(Na)
空间复杂度:
O
(
N
b
)
O(N_{b})
O(Nb)
代码
class Solution:
def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
dif=sum(A)-sum(B)
#调用collections模块中的Counter类来建立一个字典
dic=Counter(B)
#遍历A中所有元素,找出符合要求的元素即可
for a in A:
#观察B中是否有符合要求的元素
if a-dif//2 in dic:
return [a,a-dif//2]