lintcode--57. 三数之和

描述

给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。

注意事项

在三元组(a, b, c),要求a <= b <= c。

结果不能包含重复的三元组。

样例

如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:

(-1, 0, 1)

(-1, -1, 2)

代码

思路:该题如果不使用暴力破解的话,可以先对原数组进行排序,然后设定三个用于迭代的变量k,i,j。使用k来固定这三个数中的第一个数,然后i从k的后一个开始,j从最后一个开始遍历,随后计算这三个值的和,等于的情况就不讨论了,如果大于target的话,我们让j向左移动,表示,需要替换一个更小的值;如果小于target的话,我们让i向右移动,表示需要替换一个更大的值。

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 List<List> threeSum(int[] numbers) {
        // write your code here
        Arrays.sort(numbers);
        List<List> result=new LinkedList<>();
        if(numbers[0]>0||numbers[numbers.length-1]<0){
            return result;
        }
        int target=0,k,length=numbers.length,i,j;
        for(k=0;kif(k>0&&numbers[k]==numbers[k-1]){
                continue;
            }
            for(i=k+1,j=length-1;iif(i>k+1&&numbers[i]==numbers[i-1]){
                    i++;
                    continue;
                }
                if(j1&&numbers[j]==numbers[j+1]){
                    j--;
                    continue;
                }
                int temp=numbers[k]+numbers[i]+numbers[j];
                if(temp==target){
                    List list=new LinkedList<>();
                    list.add(numbers[k]);
                    list.add(numbers[i]);
                    list.add(numbers[j]);
                    result.add(list);
                    i++;j--;
                }else if(temp>target){
                    j--;
                }else{
                    i++;
                }
            }
        }
        return result;
    }
}

你可能感兴趣的:(LintCode,两根指针)