1. 三数之和

1.1 题目说明
给定一个整数数组 nums,判断数组中是否存在三个元素 nums[i], nums[j], nums[k],使得它们的和为 0,返回所有符合条件且不重复的三元组。要求:
- 三元组
[nums[i], nums[j], nums[k]]满足i != j != k,同时nums[i] + nums[j] + nums[k] == 0。 - 输出结果中不包含重复的三元组。
示例 1
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。注意,输出的顺序和三元组的顺序并不重要。
示例 2
输入:nums = [0, 1, 1]
输出:[]
示例 3
输入:nums = [0, 0, 0]
输出:[[0, 0, 0]]
1.2 题目分析
题目要求 nums[i] + nums[j] + nums[k] == 0。需要在数组中找到对应的三个数。
解法一: 暴力枚举法:将所有的可能性都表示出来,然后利用 set 进行去重操作。 解法二: 使用排序 + 双指针就能进行解决。
推荐选择第二种方法,因为效率高。
思路:
我们将排序好的数组的第一个数字进行固定操作,然后从 1 到 n-1 这个下标范围寻找满足两数之和为 0 条件的数字。在该区间内利用双指针进行查找。
总结:
- 先排序。
- 固定一个数
a(我们固定的数小于等于 0 就行了,不需要去固定大于 0 的。如果固定的是大于 0 的数字的话我们是不能在这个数后面的区间之内找到负数的)。当a大于 0 之后我们就不要进行考虑统计了。 - 在该数后面的区间内利用'双指针算法',快速找到两个的和等于
-a就行了。
处理细节问题:
- 去重:不借助
set进行去重的操作。找到一种结果之后,left和right要跳过重复元素。当使用完一次双指针算法之后,i也需要跳过重复元素避免越界(如果数组中全是 0 的话, 跳过重复元素,可能会存在越界的情况)。 这个条件就会保证不越界了。



