[Leetcode学习-java]Fair Candy Swap(平均分配糖果)

问题:

难度:easy

说明:

输入 A B两个数组,表示 A B两个孩子手中糖的量(可以理解为重量),然后让他们交换一颗糖果,就能够让两边的糖果重量一样,如果有多个答案,返回任意一个就行。

问题链接:https://leetcode.com/problems/fair-candy-swap/

输入范围:

  • 1 <= A.length <= 10000
  • 1 <= B.length <= 10000
  • 1 <= A[i] <= 100000
  • 1 <= B[i] <= 100000

输入案例:

Example 1:
Input: A = [1,1], B = [2,2]
Output: [1,2]

Example 2:
Input: A = [1,2], B = [2,3]
Output: [1,2]

Example 3:
Input: A = [2], B = [1,3]
Output: [2,3]

我的代码:

因为相互交换一颗糖果就能够让两个数组总和一致,所以设 A 总量 sumA,B 总量 sumB,A 交换糖果 x,B 交换糖果 y:

sumA - x + y = sumB - y + x   =>   sumA - sumB = 2 (x - y)

就根据这个条件,然后直接 O(N ^ 2) 处理最简单。虽然我有想过用双栈处理,但是代码难看的不行,最后还没通过。

class Solution {
    public int[] fairCandySwap(int[] A, int[] B) {
        int sumA = 0;
        int sumB = 0;
        for(int a : A) sumA += a;
        for(int b : B) sumB += b;
        
        //    sumA - x + y = sumB - y + x
        // -> sumA - sumB = 2(x - y) = 2d
        int d = sumA - sumB >> 1;
        int i = A.length;
        int j = B.length;
        A:for(;i -- > 0;) {
            for(;j -- > 0;) 
            {
                if(A[i] - B[j] == d) break A;
            }
            j = B.length;
        }
        return new int[]{A[i],B[j]};
    }
}

猜你喜欢

转载自blog.csdn.net/qq_28033719/article/details/107385899
今日推荐