2017.9.25
首先对数组进行排序。
然后使用div对数组进行划分,div左边为小于等于0的数,div右边为大于0的数。
然后问题就转化成为,从左边找两个数 + 右边的一个数等于0;从右边找两个数 + 左边的一个数等于0;
在查找的过程中,注意跳过重复的元素,即可。
public class Solution {
/*
* @param numbers: Give an array numbers of n integer
* @return: Find all unique triplets in the array which gives the sum of zero.
*/
public static List<List<Integer>> threeSum(int[] numbers) {
// write your code here
List<List<Integer>> res = new LinkedList<>();
Arrays.sort(numbers);
int length = numbers.length;
if(length <=2 || numbers[0] > 0 || numbers[length - 1] < 0){
return res;
}
int div = 0;// 从下标div开始到下标height为大于0的数。
while(div < length && numbers[div] <= 0){
div++;
}
if(div >= 3){
if(numbers[div - 1] + numbers[div - 2] + numbers[div - 3] == 0){
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(0);
list.add(0);
list.add(0);
res.add(list);
}
}
for(int i = div ; i < length;i++){
// 这里是为了跳过重复的元素
if(i != length-1 && numbers[i] == numbers[i+1]){
continue;
}
for(int j = 0; j < div; j++){
if(numbers[j] + numbers[i] < 0){
continue;
}
for(int h = j+1; h < div; h++){
if(h != div-1 && numbers[h] == numbers[h+1]){
continue;
}
if(numbers[j] + numbers[h] + numbers[i] == 0){
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(numbers[j]);
list.add(numbers[h]);
list.add(numbers[i]);
if(res.contains(list)){
continue;
}
res.add(list);
}
}
if(j != div-1 && numbers[j] == numbers[j+1]){
j++;
}
}
}
for(int i = 0 ; i < div;i++){
// 这里是为了跳过重复的元素
if(i != div - 1 && numbers[i] == numbers[i+1]){
continue;
}
for(int j = div; j < length; j++){
if(numbers[j] + numbers[i] > 0){
continue;
}
for(int h = j+1; h < length; h++){
if(h != length-1 && numbers[h] == numbers[h+1]){
continue;
}
if(numbers[j] + numbers[h] + numbers[i] == 0){
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(numbers[i]);
list.add(numbers[j]);
list.add(numbers[h]);
if(res.contains(list)){
continue;
}
res.add(list);
}
}
if(j != length-1 && numbers[j] == numbers[j+1]){
j++;
}
}
}
return res;
}
}
本文介绍了一种解决三数之和问题的有效算法。通过先排序再划分数组为正负两部分,分别寻找符合条件的三个整数使得其和为零。在搜索过程中,通过跳过重复元素来避免重复解。
3万+

被折叠的 条评论
为什么被折叠?



