【刷题打卡】888. 公平的糖果交换

109 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

一、题目描述:

888. 公平的糖果交换 - 力扣(LeetCode)

爱丽丝和鲍勃拥有不同总数量的糖果。给你两个数组 aliceSizesbobSizesaliceSizes[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]

 

提示:

  • 1 <= aliceSizes.length, bobSizes.length <= 10^4
  • 1 <= aliceSizes[i], bobSizes[j] <= 10^5
  • 爱丽丝和鲍勃的糖果总数量不同。
  • 题目数据保证对于给定的输入至少存在一个有效答案。

二、思路分析:

双指针

  1. 求出两数组元素和,并用第一个数组和减去第二个数组和得到差值
  2. 对两数组进行升序排序,方便后序操作
  3. 采用双指针遍历两数组,如果两个数组的当前元素之差等于两个数组和差值的一半说明它们就是需要交换的糖果数,将它们作为结果返回,如果小于,指向第一个数组的指针向下一位置移动,如果大于,指向第二个数组的指针向下一位置移动,不断重复上述操作直到找到满足条件的糖果
  4. 没有找到能交换的糖果,返回空数组

三、AC 代码:

class Solution {
public:
    vector<int> fairCandySwap(vector<int>& aliceSizes, vector<int>& bobSizes) {
           int alicessum=0,bobsum=0;
           for(int i=0;i<aliceSizes.size();i++)
           {
               alicessum+=aliceSizes[i];
           }
           for(int i=0;i<bobSizes.size();i++)
           {
               bobsum+=bobSizes[i];
           }
           sort(aliceSizes.begin(),aliceSizes.end());
           sort(bobSizes.begin(),bobSizes.end());
           int target=(alicessum-bobsum)/2;
           int i=0,j=0;
           while(i<aliceSizes.size()&&j<bobSizes.size())
           {
                int sub=aliceSizes[i]-bobSizes[j];
                if(target==sub)
                {
                    return {aliceSizes[i],bobSizes[j]};
                }
                else if(target<sub)
                {
                    j++;
                }
                else
                {
                    i++;
                }
           }
           return {};
    }
};