- LeetCode 热题 100 - 两数之和
- 字母异位词分组
- 最长连续序列
- 移动零
- 盛最多水的容器
- 三数之和
- 接雨水
- 找到字符串中所有字母异位词
- 无重复字符的最长子串
- 和为 K 的子数组
- 滑动窗口最大值
三数之和
class 数组,双指针,排序给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
示例 2:
示例 3:
提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
解法一:
解法二:
要解决这个问题,我们需要找到一个整数数组 nums
中的所有不重复的三元组 [nums[i], nums[j], nums[k]]
,使得它们的和为零。经典的方法是使用排序加上双指针来实现。下面是详细的解决方案及其实现。
算法步骤
排序数组:
首先对数组进行排序,这有助于使用双指针方法有效地找到合适的三元组。
遍历数组:
对于每个元素
nums[i]
,在剩下的元素中使用双指针寻找另外两个元素nums[j]
和nums[k]
,使得nums[i] + nums[j] + nums[k] == 0
。双指针查找:
如果和为 0,则找到一个三元组,存储结果,并移动两个指针以寻找其他可能的组合。
如果和小于 0,说明需要更大的数,因此移动
left
指针以增加和。如果和大于 0,说明需要更小的数,因此移动
right
指针以减小和。使用两个指针
left
和right
,分别指向i+1
和数组的末尾。根据
nums[i] + nums[left] + nums[right]
的和与 0 的关系调整指针:跳过重复元素:
为了避免重复的三元组结果,需要跳过数组中相邻的相同元素。即,当
nums[i] == nums[i-1]
时,跳过该元素以避免重复计算。结果去重:
使用内置的数据结构来避免三元组重复,可以通过哈希集合或者简单地在算法中处理。
代码实现
复杂度分析
时间复杂度:O(n²),其中 n 是数组的长度。排序的时间复杂度是 O(n log n),而双指针查找的时间复杂度是 O(n²)。
空间复杂度:O(1)(不考虑存储结果的空间),因为我们只使用了常量级别的额外空间来处理指针。
说明
去重处理:通过跳过相同的元素,避免了重复的三元组。在
nums[i]
的选择和left
、right
指针的移动中都进行了去重处理。边界条件:遍历数组时只到
n - 2
,因为至少需要三个数来形成一个三元组。双指针策略:利用双指针从两端收缩,可以高效地找到满足条件的组合,避免了不必要的计算。
这种方法利用了排序和双指针的优势,使得我们能够在合理的时间复杂度下解决该问题。
字数统计 |

JavaScript语言