题号15
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
未去重版本
整体思路:先排序再双指针遍历
java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//先排序
int size=nums.length;
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (nums[j] < nums[i]) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
}
//创建一个列表(其中元素为Integer类型)的列表的变量
List<List<Integer>> result=new ArrayList<>();
//双指针
int fast=size-1;
for(int cur=0;cur<size-2;cur++){
int slow=cur+1;
while(slow<fast){
if(nums[cur]+nums[slow]+nums[fast]==0)
{
//加入操作
//Array.asList是Java标准库中的方法
//它用来接收一系列的对象,并把它们转化为固定大小的列表
//在这个例子中,它创建了一个包含这三个整数的列表
result.add(Arrays.asList(nums[cur],nums[slow],nums[fast]));
slow++;
fast--;
}
else if(slow==size&&nums[cur]+nums[slow]+nums[fast]>0)
fast--;
else
slow++;
}
fast=size-1;
}
return result;
}
}
优化后:
java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//先排序
int size=nums.length;
Arrays.sort(nums);
//创建一个列表(其中元素为Integer类型)的列表的变量
List<List<Integer>> result=new ArrayList<>();
//双指针
int fast=size-1;
for(int cur=0;cur<size-2;cur++){
//去重:若下一个cur与上一个相同则跳过
if(cur>0&&nums[cur]==nums[cur-1])
continue;
int slow=cur+1;
while(slow<fast){
if(nums[cur]+nums[slow]+nums[fast]==0)
{
//加入操作
//Array.asList是Java标准库中的方法
//它用来接收一系列的对象,并把它们转化为固定大小的列表
//在这个例子中,它创建了一个包含这三个整数的列表
result.add(Arrays.asList(nums[cur],nums[slow],nums[fast]));
//去重
while(slow<fast&&nums[slow]==nums[slow+1])
slow++;
while(slow<fast&&nums[fast]==nums[fast-1])
fast--;
slow++;
fast--;
}
else if(nums[cur]+nums[slow]+nums[fast]>0)
fast--;
else
slow++;
}
fast=size-1;
}
return result;
}
}
使用了自带的Arrays.sort功能,比冒泡排序简洁高效
在add之前添加了去重功能