无脑解!!!(表示懒得思考,超时再考虑,然而没超时)
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
for(int i = 0; i < num.length - 2; ++i){
for(int j = i + 1; j < num.length - 1; ++j){
for(int k = j + 1; k < num.length; ++k){
if(num[i] + num[j] + num[k] == 0){
int a = Math.min(Math.min(num[i], num[j]), num[k]);
int c = Math.max(Math.max(num[i], num[j]), num[k]);
int b = 0 - a - c;
boolean flag = false;
for(int m = 0; m < res.size(); ++m){
if(res.get(m).get(0) == a
&& res.get(m).get(1) == b
&& res.get(m).get(2) == c){
flag = true;
break;
}
}
if(!flag){
ArrayList<Integer> tmp = new ArrayList<>();
tmp.add(a);tmp.add(b);tmp.add(c);
res.add(tmp);
}
}
}
}
}
for(int i = 1; i < res.size(); ++i){
for(int j = 1; j < res.size() - i + 1; ++j){
boolean flag = false;
if(res.get(j - 1).get(0) > res.get(j).get(0)){
flag = true;
}else if(res.get(j - 1).get(0) == res.get(j).get(0)
&& res.get(j - 1).get(1) > res.get(j).get(1)){
flag = true;
}else if(res.get(j - 1).get(0) == res.get(j).get(0)
&& res.get(j - 1).get(1) == res.get(j).get(1)
&& res.get(j - 1).get(2) > res.get(j).get(2)){
flag = true;
}
if(flag){
swap(res.get(j), res.get(j - 1), 0);
swap(res.get(j), res.get(j - 1), 1);
swap(res.get(j), res.get(j - 1), 2);
}
}
}
return res;
}
public void swap(ArrayList<Integer> arrI,ArrayList<Integer> arrJ, int index){
int temp = arrI.get(index);
arrI.set(index, arrJ.get(index));
arrJ.set(index, temp);
}
}
用脑解,先排个序,固定一个值,转化成求两个数的和,过滤相同的用map偷懒。
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
for(int i = 1; i < num.length; ++i){
for(int j = 1; j < num.length - i + 1; ++j){
if(num[j - 1] > num[j]){
int temp = num[j - 1];
num[j - 1] = num[j];
num[j] = temp;
}
}
}
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
Map<String, Boolean> map = new HashMap<>();
for(int i = 0; i < num.length - 2; ++i){
int left = i + 1, right = num.length - 1;
while(left < right){
int sum = num[left] + num[right];
if(sum == -num[i]){
String key = num[i]+","+num[left]+","+num[right];
if(!map.containsKey(key)){
map.put(key, true);
ArrayList<Integer> tmp = new ArrayList<>();
tmp.add(num[i]); tmp.add(num[left]); tmp.add(num[right]);
res.add(tmp);
}
++left;
--right;
}else if(sum > -num[i]){
--right;
}else{
++left;
}
}
}
return res;
}
}