三数之和

15 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new ArrayList<>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++)
        {
            if(i > 0 && nums[i] == nums[i-1]) continue; // 去重
            int c=nums[i];   //a+b=-c,这是那个c
            int m=i+1;      //双指针左边的下标,开始指向要判断的下一位
            int n=nums.length-1;//双指针右边的下标,开始指向最后一位
            while(m<n)
            {
                if(nums[m]+nums[n]==-c)
                {
                   list.add(Arrays.asList(nums[i],nums[m],nums[n]));
                    while(m<n&&nums[m]==nums[m+1])  //去重,如果下一个是相同,代表已经有两个元素相同了,所以如果为0,那么第三个元素一定是为0的,那么就肯定重复了,比如说[-2,0,0,2,2]就会出现两个[-2,0,2]这种情况,所以如果有相等的元素,肯定就不会再要了
                        m++;
                    while(m<n&&nums[n]==nums[n-1])   //去重
                        n--;
                    m++;
                    n--;
                }
                else if(nums[m]+nums[n]<-c)
                {
                  m++;
                }
                else
                {
                    n--;
                }
                    
            }
        }
        return list;
    }
}

posted @ 2019-07-29 21:31  小路不会迷路  阅读(149)  评论(0编辑  收藏  举报