目录
一、题目
1、题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:输入:nums = []
输出:[]
示例 3:输入:nums = [0]
输出:[]提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
2、基础框架
Java 版本给出的基础框架代码如下:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
}
3、原题链接
LeetCode 15. 三数之和
二、解题报告
1、思路分析
先排序,三数之和有三种情况,大于0,小于0,等于0,
等于0,则添加到我们的集合中,
小于0,则增大和,再和0比较
大于0,则减小和,再和0比较
2、时间复杂度
缺,后补!!!!!!!!!!!
3、代码详解
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//排序数组
Arrays.sort(nums);
int n = nums.length;
//存储结果的集合
List<List<Integer>>res = new ArrayList<>();
int sum = 0;
//遍历枚举
for(int i=0;i<n-2;i++){
//双指针
int left=i+1,right=n-1;
while(left<right){
sum = nums[i]+nums[left]+nums[right];
//相等则把这三个元素放入集合list中
if(sum==0){
List<Integer>list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[left]]);
list.add(nums[right]);
//检差res中是否存在list,不存在则添加
if(!res.contains(list)){
res.add(list);
}
//指针偏移
left++;
right--;
//若和大于0,则把right左移
}else if(sum>0){
right--;
//和小于0,则把left右移
}else{
left++;
}
}
}
return res;
}
}
三、本题小知识
三数之和,枚举;