LeetCode 面试题 16.21. 交换和

一、题目

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

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

示例:

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

示例:

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

提示:

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

  点击此处跳转题目

二、C# 题解

  排序 + 双指针:

public class Solution {
    public int[] FindSwapValues(int[] array1, int[] array2) {
        int sum1 = array1.Sum(), sum2 = array2.Sum();
        int diff = sum2 - sum1;
        if (diff % 2 != 0) return Array.Empty<int>(); // 如果差值为奇数,则必定找不到答案
        diff >>= 1;                                   // diff 除以 2 才是互换两个数的差值
        Array.Sort(array1);
        Array.Sort(array2);
        int j = 0;
        for (var i = 0; i < array1.Length; i++) {
            if (i > 0 && array1[i] == array1[i - 1]) continue;              // 和前面一样的数则跳过
            int target = array1[i] + diff;                                  // 目标数
            while (j < array2.Length && array2[j] < target) j++;            // 比目标数小则继续找
            if (j == array2.Length) break;                                  // 判断越界
            if (array2[j] == target) return new[] { array1[i], array2[j] }; // 找到目标则返回结果
        }
        return Array.Empty<int>();
    }
}
  • 时间:172 ms,击败 42.86% 使用 C# 的用户
  • 内存:50.94 MB,击败 71.43% 使用 C# 的用户

  哈希表直接查找:

public class Solution {
    public int[] FindSwapValues(int[] array1, int[] array2) {
        int sum1 = array1.Sum(), sum2 = array2.Sum();
        int diff = sum2 - sum1;
        if (diff % 2 != 0) return Array.Empty<int>();
        diff >>= 1;
        HashSet<int> set = new HashSet<int>(array2);
        foreach (int i in array1) {
            if (set.Contains(i + diff)) return new[] { i, i + diff };
        }
        return Array.Empty<int>();
    }
}
  • 时间:168 ms,击败 85.71% 使用 C# 的用户
  • 内存:49.35 MB,击败 85.71% 使用 C# 的用户
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔗理苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值