23.3Sum(三数和为零)

Posted yjxyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23.3Sum(三数和为零)相关的知识,希望对你有一定的参考价值。

Level:

??Medium

题目描述:

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路分析:

?求数组中三数和为零的情况,首先我们将数组进行排序,然后遍历数组,设置两个指针left和right,访问到节点i的时候,将left设置为i+1,right设置为nums.length-1。然后看nums[left]和nums[right]的和是否为-nums[i],如果是,那么就找到一组满足要求的解,如果不能则移动left和right,直到相等。

? 注意要避免重复的情况

代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>>res=new ArrayList<>();
        if(nums==null||nums.length<3)
            return res;
        Arrays.sort(nums);  //进行排序
        for(int i=0;i<nums.length;i++){
            int towsum=-nums[i];
            int left=i+1;
            int right=nums.length-1;
            while(left<right){
                if(nums[left]+nums[right]==towsum){
                    res.add(Arrays.asList(nums[i],nums[left],nums[right]));
                    left++;
                    while(left<nums.length&&nums[left]==nums[left-1])
                        left++;               //避免出现重复情况
                    right--;
                    while(right>=0&&nums[right]==nums[right+1])
                        right--;              //避免出现重复情况
                }
                else if(nums[left]+nums[right]<towsum){
                    left++;
                }
                else{
                    right--;
                }
            }
            while(i<nums.length-1&&nums[i]==nums[i+1])
                i++;              //避免出现重复情况
        }
        return res;
    }
}

以上是关于23.3Sum(三数和为零)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode15题: 寻找三数和,附完整代码

三数和的问题

[LintCode/LeetCode]——两数和三数和四数和

Zero Sum 和为零(深搜)

[LeetCode] 15. 3Sum ☆☆☆(3数和为0)

LeetCode面试必备100题:3Sum 数组中查找三个和为零的数