题目:

运行过程:



运行结果:
运行中出现的错误:

解决办法:

在前面加上这个(原因是因为前面没有cmp函数的定义所以无法执行。
题目过程:
一、
1、下标 i、j、k 互不相等 i≠j,i≠k,j≠k
2、三个数字相加等于 0:numsi+numsj+numsk = 0
3、返回所有不重复的三元组,不能有重复答案。三元组内部顺序、答案数组顺序无所谓。
二、直接用暴力解法
1、三层 for 循环枚举 i,j,k,判断和为 0。
2、数组稍大直接超时。
3、去重。数组有重复数字,会算出一模一样的三元组,很难处理。
思考优化!!
1、三数之和 a+b+c=0,等价于 b + c = -a。
2、固定第一个数 a,剩下两个数转化成:在剩下的数字里找两个数相加等于 -a。
3、两数之和如果数组有序,可以用双指针。
4、所以整体思路:先把整个数组排序!
三、算法整体流程:
1、数组排序。
2、遍历每一个下标i,固定a = numsi。
如果a>0:后面全部数字都≥a,三数之和不可能等于 0,直接 break 结束循环。
去重 i:如果当前numsi和前一个numsi-1相等,跳过,避免重复三元组。
3、i 固定后,设置双指针:
left = i+1 i 的下一个位置
right = n-1 数组末尾
4、计算三数总和 sum = numsi+numsleft+numsright
sum == 0:找到一组答案,记录下来。
这里还要去重 left、right:left 往后跳过相同值;right 往前跳过相同值。然后 left++,right--。
sum < 0:总和太小,需要变大,left++
sum > 0:总和太大,需要变小,right--
5、收集全部答案返回。
四、人脑模拟。
nums = -1,0,1,2,-1,-4
排序后:-4, -1, -1, 0, 1, 2,长度 n=6 i 从 0 开始:
1、i=0,a=-4。目标找 b+c = 4 left=1 (-1), right=5 (2)
sum = -4 + (-1)+2 = -3 < 0 → left++ → left=2 (-1)
sum=-4 + (-1)+2 =-3 <0 → left++ → left=3 (0)
sum=-4+0+2=-2<0 → left++ → left=4 (1)
sum=-4+1+2 =-1<0 → left++。left >= right,本轮结束。无结果。
2、i=1,a=-1。目标 b+c = 1
left=2 (-1), right=5 (2)
sum = -1 + (-1)+2 = 0 √ 找到 -1,-1,2
现在去重:left 现在是 2,nums 2==nums 3,left 跳到 3;right=5,nums 5≠nums 4。然后
left=3,right=4。
sum = -1 +0 +1 =0 √ 找到 -1,0,1
去重:left++, right--,此时 left >= right,本轮结束。
等等... ...