比较直观的方法就是使用三层循环嵌套来暴力迭代找出答案.
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(i>0&&nums[i]==nums[i-1])continue;
for (int j=i+1;j<nums.length;j++){
if(j>i+1&&nums[j]==nums[j-1])continue;
for(int k=j+1;k<nums.length;k++){
if(k>j+1&&nums[k]==nums[k-1])continue;
if(nums[i]+nums[j]+nums[k]==0){
List<Integer>temp = new ArrayList<>();
temp.add(nums[i]);
temp.add(nums[j]);
temp.add(nums[k]);
res.add(temp);
}
}
}
}
return res;
}
不过太简单~过不了,会超时.看了一下题解,知道了双指针的方法.三层循环变两层循环.
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int n = nums.length;
Arrays.sort(nums);
for(int i=0;i<n;i++){
if(i>0&&nums[i]==nums[i-1])continue;
int L=i+1;
int R = n-1;
while (R>L){
if(L>i+1&&nums[L]==nums[L-1]){L++;continue;}
if(R<n-1&&nums[R]==nums[R+1]){R--;continue;}
if(nums[i]+nums[L]+nums[R]>0) R--;
else if(nums[i]+nums[L]+nums[R]<0) L++;
else{List<Integer>temp = new ArrayList<>();
temp.add(nums[i]);
temp.add(nums[R]);
temp.add(nums[L]);
res.add(temp);
R--;L++;}
}
}
return res;
}
首先对输入数组进行排序.然后第一层循环比较常规,逐个进行迭代.第二个层循环则是对第一层循环之后的数字进行迭代.并且是使用双指针进行遍历.双指针指向剩余数字的一头一尾.如果三个数字相加>0,那么左指针往右走,让三数之和小一点,向0靠拢.如果三个数字相加<0,那么右指针往左走,让数字之和大一点.
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int n = nums.length;
Arrays.sort(nums);
for(int i=0;i<n;i++){
if(i>0&&nums[i]==nums[i-1])continue;
int L=i+1;
int R = n-1;
while (R>L){
if(L>i+1&&nums[L]==nums[L-1]){L++;continue;}
if(R<n-1&&nums[R]==nums[R+1]){R--;continue;}
if(nums[i]+nums[L]+nums[R]>0) R--;
else if(nums[i]+nums[L]+nums[R]<0) L++;
else{List<Integer>temp = new ArrayList<>();
temp.add(nums[i]);
temp.add(nums[R]);
temp.add(nums[L]);
res.add(temp);
R--;L++;}
}
}
return res;
}