一、题目
二、代码
最容易想到的思路就是暴力解法,三重循环,但是会超时。
下面采用排序 + 三指针的方法进行优化。
- 对数组进行排序
- 遍历该数组。如果nums[i]>0,后面的数肯定都>0,不会出现三数相加==0的情况,可以直接返回。如果nums[i] == nums[i + 1],属于重复元素,可能会出现重复解,因此跳过
- 设置双指针 j = i + 1, m = len - 1。j < m时,执行循环:
当 nums[i]+nums[j]+nums[m]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。同时j++ , m--。
若和大于0,说明 nums[m]太大,m左移
若和小于0,说明 nums[j] 太小,j右移
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> triple = new ArrayList<>();
Arrays.sort(nums);
int i = 0;
int len = nums.length;
while(i < len && nums[i] <= 0){
int j = i + 1;
int m = len - 1;
while(j < m){
List<Integer> numList = new ArrayList<>();
if(nums[i] + nums[j] + nums[m] == 0){
numList.add(nums[i]);
numList.add(nums[j]);
numList.add(nums[m]);
System.out.println(numList);
triple.add(numList);
while(j + 1 < len && nums[j] == nums[j + 1]){
j++;
}
while(m -1 >= 0 && nums[m] == nums[m - 1]){
m--;
}
j++;
m--;
}else if(nums[i] + nums[j] + nums[m] < 0){
j++;
}else{
m--;
}
}
while( i + 1 < len && nums[i] == nums[i + 1]){
i++;
}
i++;
}
return triple;
}
}