LeetCode三数之和-js题解

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

示例 1:

复制代码
输入:nums = [-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:

复制代码
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

复制代码
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
https://leetcode.cn/problems/3sum/

这题的题解我看了一个多小时,啊,很专注的盯了一个小时才看懂,下面直接放上题解,做个记录。


我说CSDN能不能给手机加个代码编辑器啊!!!

https://leetcode.cn/problems/3sum/solution/hua-jie-suan-fa-15-san-shu-zhi-he-by-guanpengchn/

大家在评论区对这个算法的反馈都挺好,但我一开始没看懂,所以不觉得好,以下是大家和我对这个算法的一些疑惑点

  • 为啥 if(nums == null || len < 3) return ans;

不知道有没有对这里有疑惑,我反正没有,但是还是说一下。

这里相当于一个参数检验,如果没有提供nums,或者长度小于3(不满足题目要求的三数之和,起码得给3个数吧,不然还做啥),就可以直接终止函数了。

  • 为啥 if(numsi > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环为啥 if(i > 0 && numsi == numsi-1) continue; // 去重

这里我一开始也不懂的,凭什么i大于0了,就直接结束了?

这里要注意,题解做了个从小到大的排序。

如果这时候i已经大于0了,那么L,R对应的值也必然大于0(该算法的思路就是L,R在i之后),那么i大于0的时候,后面怎么组合,三数之和都不会等于0了。

  • 为啥 push完了,i不++,而是继续下一轮L++, R--

这里我一开始也困惑,为啥i不++,甚至还能继续用来push(题目不是说什么ijk不相等,不重复之类的话吗)。

最后我怀疑是不是自己审错题了,于是我又重新看了一遍题目,以及示例1,茅塞顿开好吧。

i,j,k是不能相等,但是最终结果的\[...,...,...],其中的每一个...,题目并没有说,i 只允许被其中一个使用一次,也就是每一个...都可以用这个i用一次。

  • 为啥 while (L<R && numsL == numsL+1) L++; // 去重 while (L<R && numsR == numsR-1) R--; // 去重

这个地方已经有一些题友开始不懂了,我当然一开始也不理解了,怎么老是去重啊,这个算法的小细节怎么搞这么多,普通人真的能想到吗?

那为什么要做这一步呢?还是得审题!!!

题目最后一个注意说: 答案中不可以包含重复的三元组。

那题解的这个去重操作又是放在push之后做的,我们来看一下。

如果刚push完i L R,准备进行下一轮酣畅淋漓的sum === 0判断,如果恰好L与上一个L的值相等,会怎么样?numsi不变,是上一个i,L相等的话就是上一个L,满足sum等于0的话,numsR的值也只能和上一个R相等,那这里不就有重复了吗,无法满足题目给的贴心注意提示!即使一直没找到满足的R,这里的相等的L也是没必要一直参与sum的计算的,因此这里直接while处理到不相等为止就好了,R也是同理。

  • 为啥 else if (sum < 0) L++; else if (sum > 0) R--;

这里应该不会有疑惑,但还是说一下。

因为做了排序,如果sum小于0了,那就是整体偏负呗,把L往大整点,大于0就把R整小点,跟那啥秤砣一样,挪动挪动就好。

相关推荐
猫猫不是喵喵.1 小时前
Vue3 Props 属性
前端·javascript·vue.js
luj_17682 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
geats人山人海5 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz5 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni6 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu6 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7986 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭6 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶6 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶6 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展