15. 3Sum

作者: wtmxx | 来源:发表于2018-02-07 12:13 被阅读0次

思路是先进行排序
然后固定左边元素(如果和之前元素重复需要跳过)
从剩下的元素中找到两个数使3个数和为0,找的时候采用从两头往中间找的方法
如果和小于零,那么左边游标前进
如果和大于零,那么右边游标后退
如果和等于零,那么左右同时往中间靠拢,并且跳过所有和当前值相等元素
左游标大于等于右游标时退出循环

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> zz = new ArrayList<>();
        Arrays.sort(nums);
        int len = nums.length;
        if(len<3)
            return zz;
        for(int i=0;i<len-2;i++){
            // System.out.println(zz);
            while(i!=0&&i<len-2&&nums[i]==nums[i-1])i++;
            int p = i+1, q = len -1;
            while(p<q){
                if(nums[i]+nums[p]+nums[q]==0){
                    List<Integer> tmp = new ArrayList<>();
                    tmp.add(nums[i]);
                    tmp.add(nums[p]);
                    tmp.add(nums[q]);
                    zz.add(tmp);
                    p++;
                    q--;
                    while(p<q&&nums[p]==nums[p-1])p++;
                    while(q!=len-1&&p<q&&nums[q]==nums[q+1])q--;
                }else if(nums[i]+nums[p]+nums[q]<0){
                    p++;
                }else{
                    q--;
                }
            }
        }
        return zz;
    }
}

相关文章

网友评论

      本文标题:15. 3Sum

      本文链接:https://www.haomeiwen.com/subject/uqvozxtx.html