爱丽丝和鲍勃拥有不同总数量的糖果。给你两个数组 aliceSizes
和 bobSizes
,aliceSizes[i]
是爱丽丝拥有的第 i
盒糖果中的糖果数量,bobSizes[j]
是鲍勃拥有的第 j
盒糖果中的糖果数量。
两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果。一个人拥有的糖果总数量是他们每盒糖果数量的总和。
返回一个整数数组 answer
,其中 answer[0]
是爱丽丝必须交换的糖果盒中的糖果的数目,answer[1]
是鲍勃必须交换的糖果盒中的糖果的数目。如果存在多个答案,你可以返回其中 任何一个 。题目测试用例保证存在与输入对应的答案。
示例 1:
输入:aliceSizes = [1,1], bobSizes = [2,2] 输出:[1,2]
示例 2:
输入:aliceSizes = [1,2], bobSizes = [2,3] 输出:[1,2]
示例 3:
输入:aliceSizes = [2], bobSizes = [1,3] 输出:[2,3]
示例 4:
输入:aliceSizes = [1,2,5], bobSizes = [2,4] 输出:[5,4]
我的思路:爱丽丝和鲍勃的糖果除以2,得到平均数mid;然后遍历少于平均数的那个人,如果另外一个人存在(少的人需要的数+少的人出的糖果数),那就返回就行了
class Solution {
public int[] fairCandySwap(int[] aliceSizes, int[] bobSizes) {
int all1=0;
int all2=0;
List<Integer> list=new ArrayList<>();
List<Integer> list1=new ArrayList<>();
int res[]=new int[2];
for(int x:aliceSizes){
all1+=x;
list1.add(x);
}
for(int x:bobSizes){
all2+=x;
list.add(x);
}
int mid=(all1+all2)/2;
if(all1<mid){
int ch=mid-all1;
for(int x:aliceSizes){
if(list.contains(ch+x)){
res[0]=x;
res[1]=x+ch;
}
}
}else{
int ch=mid-all2;
for(int x:bobSizes){
if(list1.contains(ch+x)){
res[0]=x+ch;
res[1]=x;
}
}
}
return res;
}
}
然后,成功地失败了------------超时!
我们来看看大佬是怎么做的:
class Solution {
public int[] fairCandySwap(int[] aliceSizes, int[] bobSizes) {
int all1=Arrays.stream(aliceSizes).sum();
int all2=Arrays.stream(bobSizes).sum();
Set<Integer> list=new HashSet<>();
int res[]=new int[2];
for(int x:bobSizes){
list.add(x);
}
int mid=(all1+all2)/2;
int ch=mid-all1;
for(int x:aliceSizes){
int y=x+ch;
if(list.contains(y)){
res[0]=x;
res[1]=x+ch;
}
}
return res;
}
}
可以看出大佬的思路跟我的也差不多(狗头)
就是我忽略了一点(数学不好),不用判断是爱丽丝的糖多还是鲍勃的糖多,结果都一样!
但是导致我超时的关键是:我用的ArrayList,但是大佬用的HashSet!
(好嘛,我数据结构也没好好学...)
HashSet的查找效率更高