888. 公平的糖果交换--LeetCode
阅读原文时间:2023年07月09日阅读:1

来源:力扣(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;
    }
};

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章