• 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# 的用户
  • 相关阅读:
    生态环境领域基于R语言piecewiseSEM结构方程模型
    WebGL 绘制圆形的点
    SQL注入漏洞(MSSQL注入)
    【微机接口】8254的控制字与编程方法
    Vue2【webpack 的基本使用、webpack 中的插件、webpack 中的 loader、打包发布、Source Map】
    Python 基础 (七)Python的异常处理机制
    mysql的行列互转
    指针进阶全
    spring 微服务nacos未授权访问漏洞修复
    liunx 磁盘分区格式报错问题及挂载步骤
  • 原文地址:https://blog.csdn.net/zheliku/article/details/134388995