15. 3Sum

思路是先进行排序
然后固定左边元素(如果和之前元素重复需要跳过)
从剩下的元素中找到两个数使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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Related Topics:[Array][Two Pointers]Similar Questions:[Tw...
    lijia069阅读 255评论 0 0
  • https://leetcode.com/problems/3sum/description/输入: 数组输出: ...
    Blankeer阅读 97评论 0 0
  • 题目 Given an array S of n integers, are there elements a, ...
    persistent100阅读 303评论 0 0
  • 题目: 解析: 简单来说,就是三个数相加等于0,找出所有的无重复的组合。 思路: 开始想的很简单,先把所有的的都找...
    夏臻Rock阅读 470评论 0 0
  • Given an array S of n integers, are there elements a, b, ...
    Jeanz阅读 80评论 0 0