[题目练习】三数之和

题目:

运行过程:

运行结果:

运行中出现的错误:

解决办法:

在前面加上这个(原因是因为前面没有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,本轮结束。

等等... ...

相关推荐
老师我太想进步了202612 小时前
【数据结构-3】算法美学之降复杂度
数据结构·算法
w_zero_one1 天前
算法--构造
java·数据结构·算法
lisw051 天前
互联网上的数据结构可视化!
数据结构·信息可视化
老师我太想进步了20261 天前
【数据结构-1】例解算法复杂度
数据结构·算法
YSL0701241 天前
一文通关-----排序
数据结构·算法
夜不会漫长2 天前
C++:红黑树
数据结构·算法
冻柠檬飞冰走茶2 天前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c2 天前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶2 天前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
PaperAccept2 天前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算