888. 公平的糖果棒交换
思路一:暴力法
class Solution {
public int[] fairCandySwap(int[] A, int[] B) {
// 假设是A的长度和B的长度至少为1
int sumA = 0; // 求出A拥有糖果的总数
int sumB = 0;
for(int i=0;i<A.length;i++)
sumA+=A[i];
for(int i=0;i<B.length;i++){
sumB+=B[i];
setB.put(B[i]);
}
int A2B = (sumA+sumB)/2-sumB; // A要给B多少
// 在B中找是否有元素A[i]-A2B
for(int i=0;i<A.length;i++){
for(int j=0;j<B.length;j++){
if((A[i]-A2B) == B[j]){
int[] res = new int[2];
res[0] = A[i];
res[1] = B[j];
return res;
}
}
}
return null;
}
}
思路二:哈希表(HashSet)
事实上,我们可以将B的值预先填充到HashSet中,以更快地判断一个元素是否在其中。
class Solution {
public int[] fairCandySwap(int[] A, int[] B) {
// 假设是A的长度和B的长度至少为1
HashSet<Integer> setB = new HashSet<>();
int sumA = 0; // 求出A拥有糖果的总数
int sumB = 0;
for(int i=0;i<A.length;i++)
sumA+=A[i];
for(int i=0;i<B.length;i++){
sumB+=B[i];
setB.add(B[i]);
}
int A2B = (sumA+sumB)/2-sumB; // A要给B多少
// 在B中找是否有元素A[i]-A2B
for(int i=0;i<A.length;i++){
if(setB.contains(A[i]-A2B)){
int[] res = new int[2];
res[0] = A[i];
res[1] = (A[i]-A2B);
return res;
}
}
return null;
}
}