题目难度: 中等
原题链接
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。
返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。
(a-b)-(b-a) = 2*(a-b)
-2*(a-b)
, 那么在交换 a 和 b 之后就做到了两个数组的和相同O(M+N)
: 需要求出两个数组的和, 并遍历其中一个数组O(M+N)
: 使用集合存储两个数组的元素class Solution:
def findSwapValues(self, array1: List[int], array2: List[int]) -> List[int]:
# 先求出两个数组和的差值
diff = sum(array2) - sum(array1)
if diff & 1:
# 如果差值是奇数, 一定无法通过交换来达到相等
# 因为交换任意数字对得到的差值一定是两个数字差值的2倍
return []
# 然后将数组转成集合进行遍历, 避免重复处理相同数字
v1, v2 = set(array1), set(array2)
for x in v1:
# y即为x需要交换的数字, 交换后array1增加diff/2, 而array2减少diff/2, 两个数组新的和正好相等
y = x + diff // 2
if y in v2:
# y存在于array2中, 找到了有效数字对
return [x, y]
return []
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~