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 []