[题目练习】三数之和

题目:

运行过程:

运行结果:

运行中出现的错误:

解决办法:

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

等等... ...

相关推荐
YSL0701241 小时前
一文通关-----栈和队列
开发语言·数据结构
垆边人似月.2 小时前
找出最小的 K 个数
数据结构·c++·算法
Logic1012 小时前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
从小白到软工3 小时前
4-1 指针
c语言·开发语言·数据结构·经验分享·ai编程
码爸7 小时前
b树详细介绍与示例
数据结构·b树
开发小能手12314 小时前
答案daanC语言
数据结构·算法
启观川18 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
程序员清风19 小时前
堆与优先队列:从 Top K 到任务调度
java·数据结构·算法
suhan19 小时前
【数据结构】四、串:串string、模式匹配BF\KMP、广义表
数据结构·后端·算法