[LeetCode][Java] 3Sum

原创 2015年07月09日 11:34:57

题目:

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

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.

    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

题意:

给定一个包含n个整数的数组S,判断数组S中是否存在a,b,c 使得a + b + c = 0? 找出数组中所有和为零的存在且唯一的三元数

注意:

        1.这个三元数中的元素必须是升序的(ie, a ≤ b ≤ c).

        2.找到的所有的三元素,不能出现重复。

    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

算法分析:


参考博客  http://blog.csdn.net/ljiabin/article/details/40620579
               http://www.zhuangjingyang.com/leetcode-3sum/

首先排序所有元素,然后从每个元素开始,检测是否还有两个数字,他们三者相加等于零。这个算法很巧妙。如果我们检测的这三个数字相加大于0了。那么说明大的偏大,所以我们就把上界-1,如果小于0我们就把下界+1,如果相等的话,那么就可以先记录这个值了。那么结果就不可能再同时是另外检测的这两个数字了,所以同时变化。两层循环时间复杂度O(n²)。

从中间搜索周边两个的话需要两层循环。为了避免再次超时,使用仅搜索大于i的两个数。(一开始不明白为什么,比如说你看-4 -1 -1 0 1 2 中的0如果你从两边搜索分明有两个结果-1 和 1 而只搜索比他大的数字就没有了。这并不矛盾。因为这个结果我们在搜索-1 这个元素的时候就可以搜索到了!)

AC代码:

public class Solution 
{
    List<List<Integer>> ret = new ArrayList<List<Integer>>();
    
    public List<List<Integer>> threeSum(int[] num) 
    {
        if (num == null || num.length < 3) return ret;
        
        Arrays.sort(num);
        
        int len = num.length;
        for (int i = 0; i < len-2; i++) 
        {
            if (i > 0 && num[i] == num[i-1]) continue;//避免结果重复,其后面和它相等的直接被跳过。
            find(num, i+1, len-1, num[i]); //寻找两个数与num[i]的和为0
        }
        
        return ret;
    }
    
    public void find(int[] num, int begin, int end, int target) 
    {
        int l = begin, r = end;
        while (l < r)
        {
            if (num[l] + num[r] + target == 0) 
            {
                List<Integer> ans = new ArrayList<Integer>();
                ans.add(target);
                ans.add(num[l]);
                ans.add(num[r]);
                ret.add(ans); //放入结果集中
                while (l < r && num[l] == num[l+1]) l++;//避免结果重复,其后面和它相等的直接被跳过。
                while (l < r && num[r] == num[r-1]) r--;////避免结果重复,其后面和它相等的直接被跳过。
                l++;
                r--;
            } 
            else if (num[l] + num[r] + target < 0) 
                l++;
            else 
                r--;
        }
    }
}


版权声明:本文为博主原创文章,转载注明出处

【LeetCode】3Sum 解题报告

这道题凭我现有知识实在解答不上来,只好网上搜索解法,才发现 K Sum 是一类问题,但是网上没有比较简洁的代码,我想对于初学者来说,可能还是想先看看这道题怎么解,然后才有兴趣去看其扩展吧。 【题目】 ...
  • ljiabin
  • ljiabin
  • 2014年10月30日 16:00
  • 28003

【Leetcode 15】3Sum 三数和问题 C++

leetcode15 threeSum 三数和问题,C++
  • u010656539
  • u010656539
  • 2016年08月14日 15:30
  • 1711

LeetCode 3Sum 三个数和为零的集合 C++完整程序

掌握了这样的题的要诀就好办: 1 排序 2 前面的两个小数和后面的一个大数相加比较,如果小于0,那么前面的数往前进,增大; 如果大于0,那么后面的数往前进,减小。 3 前面的数和后面的数相遇,本...
  • kenden23
  • kenden23
  • 2013年11月24日 19:11
  • 4286

leetcode解题之 15. 3Sum Java版(结果为目标值的三个数字)

leetcode解题之 15. 3Sum Java版(结果为目标值的三个数字)
  • mine_song
  • mine_song
  • 2017年04月06日 18:29
  • 236

leetcode 第15题 <3Sum>(java)

题面 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find a...
  • mr_phy
  • mr_phy
  • 2017年03月12日 20:50
  • 186

[LeetCode] 015. 3Sum (Medium) (C++/Java/Python)

[LeetCode] 015. 3Sum (Medium) (C++/Java/Python)
  • hcbbt
  • hcbbt
  • 2015年03月03日 18:53
  • 2811

[leetcode]15. 3Sum(Java实现)

https://leetcode.com/problems/3sum/#/description Given an array S of n integers, are ther...
  • zjkC050818
  • zjkC050818
  • 2017年06月18日 11:12
  • 167

LeetCode : 3Sum [java]

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all u...
  • hackeraaa
  • hackeraaa
  • 2016年03月06日 13:03
  • 125

【LeetCode-面试算法经典-Java实现】【016-3 Sum Closest(最接近的三个数的和)】

【016-3 Sum Closest(最接近的三个数的和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given an array S of n integers, ...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月21日 07:22
  • 2514

【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】

【013-3 Sum(三个数的和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given an array S of n integers, are there el...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月21日 07:15
  • 3137
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetCode][Java] 3Sum
举报原因:
原因补充:

(最多只允许输入30个字)