Leetcode题目 三数之和为0

Posted by 大雁小鱼的博客 on May 20, 2018

LeetCode题目 三数之和为0

题目

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4]
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

问题分析

这道题最容易想到的是穷举法,但是复杂度太高,系统一定会判定为超时,有没有复杂度较低的解法呢?
一般这种题目可以使用双指针法,在使用过程中需要稍作一些变化。

首先,对数组进行排序,按照从小到大排序
然后从头选择第一个元素(记为A),接着使用2个指针分别指向后面(A后面的)第一个元素和最后一个元素,于是问题就转化为,在A后面的元素中查找和为-A的两个数,问题得解

代码

    public  List<List<Integer>> threeSum(int[] nums) {

        if(nums == null || nums.length < 3){
            return new ArrayList<>();
        }

        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        Set<String> has = new HashSet<>();
        for(int i = 0;i<=nums.length-3;i++){
            int a = nums[i];//第一个数
            if(a >0){
                break;
            }
            //双指针
            int left = i+1;
            int right = nums.length-1;
            while(left < right){
                if(a + nums[left] + nums[right] == 0){
                    String cur = String.valueOf(a) + "_" + String.valueOf(nums[left]) + "_" + String.valueOf(nums[right]);
                    if(has.contains(cur)){
                        left++;
                        right--;
                        continue;
                    }
                    has.add(cur);
                    List<Integer> one = new ArrayList<>();
                    one.add(a);
                    one.add(nums[left]);
                    one.add(nums[right]);
                    result.add(one);
                    left++;
                    right--;

                }else if(a + nums[left] + nums[right] >0){
                    right--;
                }else if(a + nums[left] + nums[right] <0){
                    left++;
                }
            }
        }
        return result;
    } 

参考

答案参考网址:https://blog.csdn.net/s634772208/article/details/46729197
题目参考网址:https://leetcode-cn.com/problems/3sum/description/