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<Integer>> threeSum(int[] numbers) {
        // write your code here
        Arrays.sort(numbers);
        List<List<Integer>> 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;k<length;k++){
            if(k>0&&numbers[k]==numbers[k-1]){
                continue;
            }
            for(i=k+1,j=length-1;i<j;){
                if(i>k+1&&numbers[i]==numbers[i-1]){
                    i++;
                    continue;
                }
                if(j<length-1&&numbers[j]==numbers[j+1]){
                    j--;
                    continue;
                }
                int temp=numbers[k]+numbers[i]+numbers[j];
                if(temp==target){
                    List<Integer> 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;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值