## 题目描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != 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 。
提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105
## 题目地址
[Leetcode 15. 三数之和](https://leetcode.cn/problems/3sum/solution/san-shu-zhi-he-pai-xu-shuang-zhi-zhen-bu-wt6o/)
## 解题思路
### 1.暴力三循环
  第一种方法也是我们能够快速想出来的方法,即使用三个指针i、j、k分别指向三个数,进行遍历,遍历完进行去重操作即可,这里不做过多赘述,主要以第二种方法为主。
### 2.固定指针+双循环指针
  我们使用一个固定指针k,指向数组的开头,使其不断自增,小于nums.length - 2,这里需要小于 nums.length - 2,是因为需要保证其指针后最少有一个i指针和j指针的存在。
  随后我们使i指针指向k指针的后面一个位置,j指针指向数组末尾。
  判断sum = nums[k] + nums[i] + nums[j] 三者的和:
- sum == 0:
  这时nums[k],nums[i],nums[j]三个数即为我们所求的三个数,将其插入返回链表中,并且使得i++和j--。
>  这里需要说明一下的是,对两个指针的操作是同时的,简单说一下原因:
  在k不变的情况下,三者之和为0,那么当i++单独执行后,且不与之前的值重复,则更新后的三者必不可能为0,必大于0,此时则需要将 j--;
  反之,若仅仅更新j--,则三者之和必小于0,则下一步必然是更新i++。
  综上两种情况,无论我们怎么变化,都是需要同时变更两个指针,即该操作是需要将两者同时进行更新的,仅仅变更一个指针的话,在下一个循环内会变更另外一个指针,则会多循环一次。
- sum < 0:
三者之和 < 0,则说明值太小了,需要将小一点的数变大,仅有i++可以实现。
- sum > 0:
三者之和 > 0,则说明值太大了,需要将大一点的数变小,仅有j--可以实现。
## 代码示例
```java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ret = new LinkedList<>();
// 这里让k < nums.length - 2 ,是保证k在i和j之前。
for (int k = 0; k < nums.length - 2; k++) {
if (nums[k] > 0) {
// 如果连最小的数都是 > 0 ,那么后面的数都是比他大的数,则相加之后必为一个 > 0 的数
break;
}
if (k > 0 && nums[k] == nums[k - 1]) {
continue;
}
int i = k + 1;
int j = nums.length - 1;
while (i < j) {
// nums[i] == nums[i - 1]时,直接跳过即可,因为结果和nums[i - 1]一致
if (i >= k + 2) {
if (nums[i] == nums[i - 1]) {
i++;
continue;
}
}
// nums[j] == nums[j + 1]时,直接跳过即可,因为结果和nums[j + 1]一致
if (j < nums.length -1) {
if (nums[j] == nums[j + 1]) {
j--;
continue;
}
}
// 判断三者之和是否为0
if (nums[k] + nums[i] + nums[j] == 0) {
List<Integer> list = new LinkedList<>();
list.add(nums[k]);
list.add(nums[i]);
list.add(nums[j]);
ret.add(list);
// 这里将i和j都进行更新
i++;
j--;
} else if (nums[k] + nums[i] + nums[j] > 0) {
j--;
} else {
i++;
}
}
}
return ret;
}
}
```
没有合适的资源?快使用搜索试试~ 我知道了~
个人算法题目练习和经验总结Leetcode、Nowcoder、Luogu成功AC的题目代码.zip
共360个文件
java:342个
md:13个
iml:5个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 147 浏览量
2023-08-10
14:51:44
上传
评论
收藏 245KB ZIP 举报
温馨提示
个人算法题目练习和经验总结Leetcode、Nowcoder、Luogu成功AC的题目代码.zip 按分类归档所有练习过并且已经通过的题目,包括自己从第一次做和后续的复做的不同解法,记录学习思想的变化,总结经验。 本人在学习数据结构和算法期间,在Leetcode、Nowcoder、Luogu等一些在线OJ平台成功AC的题目代码。 对于每一道题目,分别进行管理,方便后续复盘时对原有解题思路方法的回顾。故对于本人个人而言觉得有必要的代码段进行了注释标注。 对仓库内提交的这些题目而言,即便是本人亲自编写,并且在对应的OJ平台上成功AC,但仍会在后续的学习中遗忘。 并不能够保证每道题目在任何时候都能够做到秒解。但能够从题目中抽象出解题方法,能够应用于某种类型的题目。 从具体的问题中抽象出来的解体思路,能够不断发展和延续。对本人的学习产生了较好的影响,通过总结和分析,掌握的宏观方法,虽不能在每个题目中适应,但基本上对于任何事情都能有个大体的方向支持。 也不仅仅局限于这些算法题,题目的本质是解决某一类问题,这种抽象出来的思想在各行各业,各种情况下都对本人不同程度的影响。
资源推荐
资源详情
资源评论
收起资源包目录
个人算法题目练习和经验总结Leetcode、Nowcoder、Luogu成功AC的题目代码.zip (360个子文件)
Luogu.iml 423B
Leetcode.iml 423B
Swordfingeroffer.iml 423B
PAT.iml 423B
Nowcoder.iml 423B
Solution.java 38KB
LRUCache.java 3KB
Solution.java 3KB
Solution.java 3KB
MyCircularQueue.java 3KB
MazeProblem.java 3KB
Solution.java 3KB
Solution.java 3KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
P1000.java 2KB
Solution.java 2KB
Solution.java 2KB
SelectSort.java 2KB
Solution.java 2KB
Solution.java 2KB
BubbleSort.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution2.java 2KB
Solution.java 2KB
Solution.java 2KB
P5734.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Soluttion.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 2KB
Solution.java 1KB
Main1033.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
MyQueue.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Main1031.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution2.java 1KB
Solution.java 1KB
Bank.java 1KB
Solution.java 1KB
Solution2.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution2.java 1KB
P5725.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
QuickSort.java 1KB
Solution2.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution2.java 1KB
Solution2.java 1KB
MyQueue.java 1KB
MyQueue.java 1KB
Solution2.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
Main1004.java 1KB
Solution.java 1KB
Solution.java 1KB
Solution.java 1KB
共 360 条
- 1
- 2
- 3
- 4
资源评论
onnx
- 粉丝: 9662
- 资源: 5598
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功