力扣-三数之和

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

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

来源:力扣(LeetCode)

双指针+排序,排序是为了排除重复的三元组,第一重循环数组遍历,然后利用双指针,一个指向这个数的后一位,一个指向最后,然后二分。中间有剪纸,如果这个数大于0,那么在二分时必然不会等于0,然后再用一个条件排除重复的情况,在二分得到一个可行的结果后,也要判断是否与下一位数字重复,去除重复解

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list =new ArrayList();
        int len = nums.length;
        if(len<3)
            return list;
         Arrays.sort(nums);
         for(int i=0;i<len;i++){
             if(nums[i]>0)
                return list;
            if(i>0 && nums[i]==nums[i-1])
                continue;
            int l=i+1;
            int r=len-1;
            int temp=nums[i];
            while(l<r){
                if(temp+nums[l]+nums[r]==0){
                    List<Integer> list_temp = new ArrayList();
                    list_temp.add(temp);
                    list_temp.add(nums[l]);
                    list_temp.add(nums[r]);
                    list.add(list_temp);
                    while(l<r&&nums[l]==nums[++l]);
                    while(l<r&&nums[r]==nums[--r]);
                }
                else if(temp+nums[l]+nums[r]>0)
                    r--;
                else
                    l++;
            }
         }
         return list;
    }
}

你可能感兴趣的:(leetcode,leetcode,算法,数据结构)