Leetcode-888-公平的糖果交换

Leetcode-888-公平的糖果棒交换

题目描述

  • 爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j] 是鲍勃拥有的第 j 根糖果棒的大小。

  • 因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)

  • 返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。

  • 如果有多个答案,你可以返回其中任何一个。保证答案存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
示例 1:

输入:A = [1,1], B = [2,2]
输出:[1,2]

示例 2:

输入:A = [1,2], B = [2,3]
输出:[1,2]

示例 3:

输入:A = [2], B = [1,3]
输出:[2,3]
示例 4:

输入:A = [1,2,5], B = [2,4]
输出:[5,4]

提示:

1 <= A.length <= 10000
1 <= B.length <= 10000
1 <= A[i] <= 100000
1 <= B[i] <= 100000
保证爱丽丝与鲍勃的糖果总量不同。
答案肯定存在。

方法一 : 哈希表

  • 记爱丽丝的糖果棒的总大小为sumA,鲍勃的糖果棒的总大小为sumB。
  • 设答案为 {x,y},即爱丽丝的大小为 x 的糖果棒与鲍勃的大小为 y 的糖果棒交换,则有如下等式:

mark

  • mark
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public int[] fairCandySwap(int[] A, int[] B) {
// 1. 分别求出数组A和B的和
int sumA = Arrays.stream(A).sum();
int sumB = Arrays.stream(B).sum();
int delta = (sumA - sumB)>>1;

// 2. 将A的数字存入哈希表 方便查询
int[] ans = new int[2]; // 结果集
Set<Integer> setA = new HashSet<Integer>();
for(int num:A){
setA.add(num);
}

// 3. 遍历B中每一个元素,看A中是否存在可以交换的数字
for(int y:B){
int x = y + delta;
if(setA.contains(x)){
ans[0] = x;
ans[1] = y;
break; // 存在一组立即结束
}
}

return ans;
}
}

复杂度分析:

  • 时间复杂度 : O(m + n) ,最差情况下两个数组都需要进行遍历
  • 空间复杂度 : O(n) , n 为 数组A的长度
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信