0888. 公平的糖果交换
大约 3 分钟
---
0888. 公平的糖果交换
- 标签:数组、哈希表、二分查找、排序
- 难度:简单
题目链接
题目大意
描述:
爱丽丝和鲍勃拥有不同总数量的糖果。给你两个数组 和 , 是爱丽丝拥有的第 盒糖果中的糖果数量, 是鲍勃拥有的第 盒糖果中的糖果数量。
两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果。一个人拥有的糖果总数量是他们每盒糖果数量的总和。
要求:
返回一个整数数组 ,其中 是爱丽丝必须交换的糖果盒中的糖果的数目, 是鲍勃必须交换的糖果盒中的糖果的数目。
如果存在多个答案,你可以返回其中「任何一个」。题目测试用例保证存在与输入对应的答案。
说明:
- 。
- 。
- 爱丽丝和鲍勃的糖果总数量不同。
- 题目数据保证对于给定的输入至少存在一个有效答案。
示例:
- 示例 1:
输入:aliceSizes = [1,1], bobSizes = [2,2]
输出:[1,2]- 示例 2:
输入:aliceSizes = [1,2], bobSizes = [2,3]
输出:[1,2]解题思路
思路 1:哈希表 + 数学
这道题要求找到一对糖果盒,使得交换后两人的糖果总数相等。
设爱丽丝的糖果总数为 ,鲍勃的糖果总数为 。交换后两人糖果总数相等,即:
其中 是爱丽丝交换出去的糖果数, 是鲍勃交换出去的糖果数。
化简得:
算法步骤:
- 计算爱丽丝和鲍勃的糖果总数 和 。
- 计算差值 。
- 将鲍勃的糖果数存入哈希表,方便快速查找。
- 遍历爱丽丝的糖果盒,对于每个 ,检查 是否在鲍勃的糖果盒中。
- 如果找到,返回 。
思路 1:代码
class Solution:
def fairCandySwap(self, aliceSizes: List[int], bobSizes: List[int]) -> List[int]:
# 计算爱丽丝和鲍勃的糖果总数
sumA = sum(aliceSizes)
sumB = sum(bobSizes)
# 计算差值
diff = (sumB - sumA) // 2
# 将鲍勃的糖果数存入哈希表
bobSet = set(bobSizes)
# 遍历爱丽丝的糖果盒
for x in aliceSizes:
y = x + diff
# 如果 y 在鲍勃的糖果盒中,返回结果
if y in bobSet:
return [x, y]
return []思路 1:复杂度分析
- 时间复杂度:,其中 和 分别是 和 的长度。需要遍历两个数组。
- 空间复杂度:,需要使用哈希表存储鲍勃的糖果数。