LeetCode 面试题 16.21. 交换和
LeetCode 面试题 16.21. 交换和
文章目录
- 一、题目
- 二、C# 题解
一、题目
给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。
返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。
示例:
输入: 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# 的用户
最新文章
- 电脑出现蓝屏代码0x00000050的解决方法
- android studio开发flutter应用,使用mumu模拟器调试软件
- axios不经过全局拦截器策略
- 探索向量数据库
- Riskified: 2023年电商政策滥用问题恶化,正严重挑战商家盈利底线
- Java 设计模式——组合模式
- 【nlp】2.2 传统RNN模型
- 数据分析法宝,一个 SQL 语句查询多个异构数据源
- 【MySQL】对表结构进行增删查改的操作
- CM Lab Vortex Studio 安装与配置
- 数字化转型二
- 【KVM
- 键盘接受一串字符到BUF为首地址的字节单元中,要求用下列方法分别编程,将它们以相反的次序显示在屏幕的下一行中
- es性能强悍的推演过程
- 【Seata源码学习 】 扫描@GlobalTransaction注解 篇一
- Windows系统下使用docker部署redis
- VuePress介绍及使用指南