# 三数之和
随笔:这题关键在于了解去重的细节
# 题目
给你一个整数数组
nums,判断是否存在三元组[nums[i], nums[j], nums[k]]满足i != j、i != k且j != k,同时还满足nums[i] + nums[j] + nums[k] == 0。请你返回所有和为
0且不重复的三元组。** 注意:** 答案中不可以包含重复的三元组。
示例 1:
1
2
3
4
5
6
7
8 >输入:nums = [-1,0,1,2,-1,-4]
>输出:[[-1,-1,2],[-1,0,1]]
>解释:
>nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
>nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
>nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
>不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
>注意,输出的顺序和三元组的顺序并不重要。示例 2:
1
2
3 >输入:nums = [0,1,1]
>输出:[]
>解释:唯一可能的三元组和不为 0 。示例 3:
1
2
3 >输入:nums = [0,0,0]
>输出:[[0,0,0]]
>解释:唯一可能的三元组和为 0 。提示:
3 <= nums.length <= 3000-105 <= nums[i] <= 105
思路和细节
如何移动 left 和 right 呢, 如果 nums [i] + nums [left] + nums [right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以 right 下标就应该向左移动,这样才能让三数之和小一些。
如果 nums [i] + nums [left] + nums [right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到 left 与 right 相遇为止。
动画

15.三数之和
第一步要先对 nums 进行一遍排序
去重细节
在 i 已经固定确定的时候
判断 nums [i] == nums [i-1];
为什么判断是 i-1 而不是 i+1; 因为 i+1 可能会 比如 -1 -1 2 这样的结果集 给 contine 所以 我从上一个进行判断 上一个如果重复了
# 题解
1 | public class Solution |
细节还是比较多的。