Leecode 0015. 3Sum
15. 3Sum
题目
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
1 | Given array nums = [-1, 0, 1, 2, -1, -4], |
题目大意
给定一个数组,要求在这个数组中找出 3 个数之和为 0 的所有组合。
解题思路
用 map 提前计算好任意 2 个数字之和,保存起来,可以将时间复杂度降到 O(n^2)。这一题比较麻烦的一点在于,最后输出解的时候,要求输出不重复的解。数组中同一个数字可能出现多次,同一个数字也可能使用多次,但是最后输出解的时候,不能重复。例如 [-1,-1,2] 和 [2, -1, -1]、[-1, 2, -1] 这 3 个解是重复的,即使 -1 可能出现 100 次,每次使用的 -1 的数组下标都是不同的。
这里就需要去重和排序了。map 记录每个数字出现的次数,然后对 map 的 key 数组进行排序,最后在这个排序以后的数组里面扫,找到另外 2 个数字能和自己组成 0 的组合。
1 | #include <vector> |
代码解析
- 哈希表计数:
- 使用
count_map
记录每个数字出现的次数,便于快速查询和控制使用次数 - 例如对于
nums = [-1, -1, 2]
,count_map
会记录为{-1:2, 2:1}
- 使用
- 去重机制:
- 通过
unique_nums
数组确保只处理不重复的数字 - 遍历顺序保证
a ≤ b ≤ c
,避免同一组合的不同排列被视为不同解 - 每次使用数字后暂时减少计数,使用完毕后恢复,确保正确处理重复数字
- 通过
- 寻找第三个数:
- 对于每个
a
和b
,计算c = -a - b
- 检查
c
是否存在、是否有剩余可用次数,以及是否满足c ≥ b
- 对于每个
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.