文章目录
- 一、题目
- [二、C# 题解](# 题解)
一、题目
设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。
示例 1:
输入: nums = [5,6,5], target = 11
输出: [[5,6]]
示例 2:
输入: nums = [5,6,5,6], target = 11
输出: [[5,6],[5,6]]
提示:
nums.length <= 100000
-10^5 <= nums[i], target <= 10^5
二、C# 题解
使用双指针双向检测,注意要先排序。
csharp
public class Solution {
public IList<IList<int>> PairSums(int[] nums, int target) {
IList<IList<int>> ans = new List<IList<int>>();
Array.Sort(nums);
int i = 0, j = nums.Length - 1; // 双指针
while (i < j) {
int sum = nums[i] + nums[j]; // 两数和
if (sum == target) ans.Add(new[] { nums[i++], nums[j--] }); // 找到则添加,i、j 均挪位
else if (sum > target) j--; // 如果大了,右指针左移
else i++; // 否则左指针右移
}
return ans;
}
}
- 时间:216 ms,击败 83.33% 使用 C# 的用户
- 内存:65.98 MB,击败 16.67% 使用 C# 的用户
直接遍历数组,使用 map 记录出现过的数字和次数,每次查找是否有匹配的 another。
csharp
public class Solution {
public IList<IList<int>> PairSums(int[] nums, int target) {
IList<IList<int>> ans = new List<IList<int>>();
Dictionary<int, int> dic = new Dictionary<int, int>(); // 存储出现过的数字及次数
foreach (int num in nums) {
int another = target - num; // 匹配的另一个数
if (dic.TryGetValue(another, out int value)) { // 尝试找之前是否出现过
if (value > 0) { // 如果出现过,则次数 - 1,添加结果
dic[another]--;
ans.Add(new[] { num, another });
}
else if (!dic.TryAdd(num, 1)) dic[num]++; // 出现过但次数被用完,添加 num 的记录
}
else if (!dic.TryAdd(num, 1)) dic[num]++; // 未出现过,添加 num 的记录
}
return ans;
}
}
- 时间:204 ms,击败 100.00% 使用 C# 的用户
- 内存:60.31 MB,击败 100.00% 使用 C# 的用户