描述
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。
数据范围:0≤n≤10000≤n≤1000,数组中各个元素值满足 ∣val∣≤100∣val∣≤100
空间复杂度:O(n2)O(n2),时间复杂度 O(n2)O(n2)
注意:
三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
解集中不能包含重复的三元组。
例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, -10, 20),(-10, 0, 10)
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
if(num == null){
return ans;
}
int len = num.length;
if(len<3){
return ans;
}
Arrays.sort(num);
//第一轮遍历,找到第一个值位置
for(int i = 0;i<len;i++){
if(num[i]>0){
return ans;
}
//如果值跟之前一样,结果是一样,去重使用
if(i>0 && num[i] == num[i-1]){
continue;
}
int cur = num[I];
//第二轮遍历
int left = i+1;
int right = len-1;
while(left<right){
if(cur + num[left]+num[right] == 0){
ArrayList<Integer> list = new ArrayList<>();
list.add(cur);
list.add(num[left]);
list.add(num[right]);
ans.add(list);
while(left<right && num[left] == num[left+1]){
left++;
}
while(left<right && num[right] == num[right-1]){
right--;
}
left++;
right--;
}else if(cur + num[left]+num[right] < 0){
left++;
}else{
right--;
}
}
}
return ans;
}
}
网友评论