LeetCode #888. Fair Candy Swap

题目

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]
posted @ 2020-11-20 13:37  老鼠司令  阅读(54)  评论(0编辑  收藏  举报