LeetCode题库第888题 公平的糖果棒交换

LeetCode题库第888题 公平的糖果棒交换

LeetCode第888道题 公平的糖果棒交换

首先,题目中说他们两个人的糖果的总数量是不一样的,并且要将A中的一个糖果和B的一个糖果交换后使得他们两个人的糖果的总数量相等。由此,交换糖果的目的是使得两个人的糖果的总数量相等,而要用A的那一个糖果和B中的那一个糖果交换是和他们两个糖果的总数量之差是相关的,例如:如果A的糖果的总数量比B的糖果的总重量多2,那么,就需要用A中重量为n的糖果来交换B中重量为n-1的糖果,注意:不是交换B中重量为n-2的糖果,因为:假如用A中的2交换B中的1,A的总重量减少了1,而B的糖果总重量是增加了1。
解题的思路是:

  • 将A和B的糖果的总数量分别算出来
  • 求出它们的糖果总数量之差
  • 根据A的糖果总数和B的糖果总数的大小关系来遍历A或B,在遍历的过程中根据当前糖果大小和糖果总数之差在另一个人的糖果列表中寻找满足条件的糖果
  • 注意返回的是列表,其中的两个元素都是糖果的大小且它们是有顺序关系的,第一个元素是爱丽丝必须交换的糖果棒的大小,第二个元素是Bob必须交换的糖果棒的大小。题目说如果有多个答案,你可以返回其中的任何一个,且保证答案存在。
 public int[] fairCandySwap(int[] A, int[] B) {
        int sum_A = 0;
        int sum_B = 0;
        HashMap<Integer, Integer> map_A = new HashMap<Integer, Integer>();
        HashMap<Integer, Integer> map_B = new HashMap<Integer, Integer>();
        for (int i = 0; i < A.length; i++) {
            sum_A+=A[i];
            map_A.put(A[i], i);
        }
        for (int i = 0; i < B.length; i++) {
            sum_B+=B[i];
            map_B.put(B[i], i);
        }
        int space = Math.max(sum_A, sum_B)-Math.min(sum_A, sum_B);
        if (sum_A>sum_B) {
            for (int i = 0; i < A.length; i++) {
                if (map_B.containsKey(A[i]-space/2)) {
                    return new int[] {A[i], A[i]-space/2};
                }
            }
        }
        else {
            for (int i = 0; i < B.length; i++) {
                if (map_A.containsKey(B[i]-space/2)) {
                    return new int[] {B[i]-space/2, B[i]};
                }
            }
        }
        return new int[] {};
    }

学了Python,用Python3也实现了一下,大家可以参考一下:

class Solution:
    def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
        space = abs(sum(A)-sum(B))
        if sum(A)>sum(B):
            for i in A:
                if i-space/2 in B:
                    return [i, i-space//2]
        else:
            for i in B:
                if i-space/2 in A:
                    return [i-space//2, i]
        return []
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值