题目内容:
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入: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] 。 注意,输出的顺序和三元组的顺序并不重要。
难点:
判断三元组是否重复
思路:
1. 最开始想法是进行暴力三层for循环,再进行重复数组的删除,但这样判断很麻烦;
2.减少for循环,可以通过:对数组排序+双指针的方式;
3.先对数组进行排序,有一层for循环,假设i从下标0的地方开始,同时定一个left指针在i+1的位置上,定义right指针在数组结尾的位置上。如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,right指针就应该向左移动,这样才能让三数之和小一些。如果 nums[i] + nums[left] + nums[right] < 0 说明三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。
4.接着进行每个指针的去重。
5.由于现在数组是排序后的,因此去重逻辑只需要对相邻元素进行判断即可。i指针当前位置和前一位数值相同,则代表该数组已经被统计过了,因此直接跳过(判断代码在10-11行);left和right指针对即将进行遍历的指针进行对比,如果相同,则表示已经遍历过。