来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fair-candy-swap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
假设爱丽丝的i盒糖果和鲍勃的j盒糖果已按糖果数量有序排列,aliceSizes[i]<aliceSizes[i+1] bobSizes[j]<bobSizes[j+1]
任取爱丽丝的一盒糖果aliceSizes[x],是否一定会有一盒糖果与之对应?(交换这样的两盒糖果后,两人的糖果数量相同)
一定会有一盒这样的糖果,但鲍勃有没有就不一定了
思路如下:
设
爱丽丝的糖果总数为:aliceSum
鲍勃的糖果总数为:bobSum
两人总的糖果数量:allSum
如果爱丽丝拿出aliceSizes[i]与鲍勃换,那我们期望鲍勃拿出一盒糖果数量为allSum/2-(aliceSum-aliceSizes[i])的来交换
如果鲍勃没有这样的一盒糖果,说明爱丽丝不能用aliceSizes[i]来交换,爱丽丝只能试试换下一盒糖果
题目保证一定有解,所以最终至少会找到一种换法
鲍勃与之对应交换的这盒糖果可以用二分来找(我们已经对两人的每盒糖果按数量进行排序)
class Solution {
public:
vector<int> fairCandySwap(vector<int>& aliceSizes, vector<int>& bobSizes) {
vector<int> res;
int sum1=0,sum2=0;
sort(aliceSizes.begin(),aliceSizes.end());
sort(bobSizes.begin(),bobSizes.end());
for(int i=0;i<aliceSizes.size() || i<bobSizes.size();i++){
if(i<aliceSizes.size())sum1+=aliceSizes[i];
if(i<bobSizes.size())sum2+=bobSizes[i];
}
for(int i=0;i<aliceSizes.size();i++){
int l=0,r=bobSizes.size()-1,mid,target = (sum1+sum2)/2-(sum1-aliceSizes[i]);
while(l<r){
mid = (l+r)/2;
if(bobSizes[mid]>=target)r=mid;
else l=mid+1;
}
if(bobSizes[l]==target){
res.push_back(aliceSizes[i]);
res.push_back(bobSizes[l]);
break;
}
}
return res;
}
};
手机扫一扫
移动阅读更方便
你可能感兴趣的文章