概述
题目链接:力扣
代码:
大概思路:
01.思路
顺序:排序,a去重+失败情况,for遍历,缩小范围,找到的时候bc去重
为了方便操作,先进行升序排序(题目里有,“输出的顺序和三元组的顺序并不重要”)
排完序后,在首末节点,放置指针,代表最大值和最小值,因为是三个数,所以在最小值后面再放一个指针i,最大值指针固定,由i和最小值指针来遍历。
定义3个指针,一个在头节点,一个指向头结点的下一个位置,一个指向末尾节点。
然后头结点向后++遍历,在过程中不断判断三个指针的值加起来有没有等于0,返回等于的三个指针的下标。
同时进行不断缩小范围,三个指针的大于0,说明最大值大了,末尾节点--。(因为前面两个指针是两个最小值)
三个指针的小于0,说明最小值大了,可移动的最小值节点++。
02.注意点
1.a的去重
当头节点大于0,题目就没有等于0的可能了,因为大于0的数加更大的数也是大于0的
2.三元组去重
题目要求是没有重复的三元组,假设(0,0,0),虽然三个都是重复,只要一个变动,就可以变成一个不一样的三元组,那么去重逻辑,n[i]!=n[i+1]合适还是n[i]!=n[i-1]合适?(当两个元素相同的时候,排除这一组)
n[i]!=n[i-1]合适,比如数组[-1,-1,-1,-2]的两个(-1,-1,2)会被n[i]!=n[i+1]排除,而n[i]!=n[i-1]会排除多余的(-1,-1,2),保留一个
3.b,c的去重
b、c的去重应该放在找到一个三元组之后,不然在没找到一个三元组的时候,就给b、c去重,如果是(0,0,0,0,0,0,0),那么就会可能让right<=left,破坏循环条件。
遇见的问题:
好乱好乱,一写就一堆情况出来,需要再整理
个人想法:
睡了一觉起来再看,发现好像又和我想的不一样了,之前看文章的理解,是b、c不用去重,我也不知道为啥,现在发现是要去重的,那就清晰起来了,不过感觉我的逻辑都乱乱的,不简洁,有点杂糅的感觉。
最后
以上就是爱听歌长颈鹿为你收集整理的009.三数之和-双指针题目链接:力扣代码:大概思路:遇见的问题:个人想法:的全部内容,希望文章能够帮你解决009.三数之和-双指针题目链接:力扣代码:大概思路:遇见的问题:个人想法:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复