• 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>();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 时间: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>();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 时间:168 ms,击败 85.71% 使用 C# 的用户
    • 内存:49.35 MB,击败 85.71% 使用 C# 的用户
  • 相关阅读:
    推荐一个拥有386万订阅者,10000多免费学习视频的频道
    Spring之IoC
    Acwing 906. 区间分组
    最远点采样(Farthest Point Sampling,FPS)算法详解
    如何理解UDP和TCP的区别
    Kotlin 核心语法,为什么选择Kotlin ?
    70. 爬楼梯
    Mysql数据库基础和增删改查操作
    laravel-admin联动选择展示时ueditor样式错乱
    C++设计模式_14_Facade门面模式
  • 原文地址:https://blog.csdn.net/zheliku/article/details/134388995