Leetcode-面试题 16.21. 交换和

链接

面试题 16.21. 交换和

题目

给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。

返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。

示例

示例1:
输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]
输出: [1, 3]

示例2:
输入: array1 = [1, 2, 3], array2 = [4, 5, 6]
输出: []

说明

  • 1 <= array1.length, array2.length <= 100000

思路

题目要求两个数组互相交换一个数之后,两数组的和相等,假设两个数组原本的和相差为a,那么交换的两个数应该要相差a/2,才能使得交换后两数组的和相等。

因为数组中所有的数都为整数,所以如果a为奇数,那么肯定不存在这么两个数,只有当a为偶数的时候才有可能存在。

我们可以对两个数组分别求和,求出这个a,然后遍历两个数组,寻找是否存在相差a/2的两个数。

C++ Code

class Solution {
public:
    vector<int> findSwapValues(vector<int>& array1, vector<int>& array2) {
        int sum1=0,sum2=0;
        for(int n:array1) sum1+=n;
        for(int n:array2) sum2+=n;
        if((sum1-sum2)%2!=0) return{};
        int diff=(sum1-sum2)/2;
        for(int n:array1)
        {
            for(int m:array2)
            {
                if(n-m==diff)
                    return {n,m};
            }
        }
        return {};
        

    }
};

以上代码过于暴力,会超时,因此我们可以考虑用空间换时间。

class Solution {
public:
    vector<int> findSwapValues(vector<int>& array1, vector<int>& array2) {
        int sum1=0,sum2=0;
        unordered_map<int,int> map;
        for(int n:array1) sum1+=n;
        for(int n:array2) {sum2+=n; map[n]++;}

        if((sum1-sum2)%2!=0) return{};
        int diff=(sum1-sum2)/2;

        for(int n:array1)
        {
            if (map.find(n-diff)!=map.end())
                return {n,n-diff};
        }
        return {};
        
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值