思路:枚举+相向双指针
本题整体的思路是:先排序,然后枚举三个下标中的某一个下标,剩下的两个下标由相向双指针确定。
枚举:本题枚举i,j,k任意一个下标都可以得到正确的答案,这里固定i,
外层循环枚举i ,接着需要在[i+1,n] 这个范围里找两个下标j,k使得num[j]+num[k]=−num[i] 。
双指针:根据上一个小节我们所学习到的双指针技巧,不难想到一种相向双指针算法:令j=i+1,k=n
P4005.三数之和
Leetcode 15.三数之和-原题链接
题目内容
给你一个整数数组nums ,判断是否存在三元组 [nums[i],nums[j],nums[k]] 满足 i!=j、i!=k 且 j!=k ,同时还满足 nums[i]+nums[j]+nums[k]==0 。请你输出所有和为 0 且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
输入描述
输入共两行。
-
第一行为一个整数n,代表数组nums的长度。
-
第二行为n个整数nums0,nums1,...,numsn−1,数字之间以空格分隔。
输出描述
输出所有满足条件的三元组。
每行代表一个三元组。三元组的数字之间以空格分隔。
样例1
输入
6
-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
输入
3
0 1 1
输出
说明
唯一可能的三元组和不为 0。
样例3
输入
3
0 0 0
输出
0 0 0
说明
唯一可能的三元组和为 0。
提示
- 3<=nums.length<=3000
- −105<=nums[i]<=105