问题:
难度: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]};
}
}