`
frank-liu
  • 浏览: 1682478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: 3Sum

 
阅读更多

问题描述:

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)

原问题链接:https://leetcode.com/problems/3sum/

 

问题分析

    关于这个问题的讨论在之前的一篇文章里已经说过。只不过那只是给出了一个笼统的思路和代码。针对这个具体的问题来说,它有两个额外的限制,一个是要求里面保存的三元组要按照从小到大的索引顺序。另外就是最终保存的结果里不能有重复的项。

    按照之前讨论的思路,我们首先对数组排序。然后取一个元素,再从数组的两头取两个元素,看它们的和与给定元素的差值比较。根据比较结果调整两个元素的移动位置。但是如果单纯的从头取到尾并这么去查找的话,对于给定的元素三元组其实重复查找计算了三次。所以这里需要避免重复的计算。那么该怎么来避免这个重复的计算呢?我们可以从最小的元素的位置来考虑。假设有三个元素a + b + c = 0,其中a是最小的那个元素。那么在后续的计算里要避免这个元素,我们可以在后续的计算范围里缩减到a后面的元素里。也就是说检查是否有符合a + b + c = 0的值范围可以从a后面的元素到数组的末尾。

     另外,数组里面可能有存在重复的元素。这些我们也是可以避免的。我们可以通过判断当前元素的值是否和前一个元素相同来跳过一些不必要的计算和比较。这样也可以提升程序的性能。

     按照前面的讨论,可以得到如下的代码:

 

public class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> list = new ArrayList<>();
        for(int i = 0; i < nums.length-2; i++) {
            if(i > 0 && (nums[i] == nums[i-1])) continue; // avoid duplicates
            for(int j = i+1, k = nums.length-1; j<k;) {
                if(nums[i] + nums[j] + nums[k] == 0) {
                    list.add(Arrays.asList(nums[i],nums[j],nums[k]));
                    j++;
                    k--;
                    while((j < k) && (nums[j] == nums[j-1]))j++;// avoid duplicates
                    while((j < k) && (nums[k] == nums[k+1]))k--;// avoid duplicates
                }else if(nums[i] + nums[j] + nums[k] > 0) k--;
                else j++;
            }
        }
        return list;
    }
}

 

分享到:
评论
1 楼 shihengli2010 2017-04-24  
赞  去重情况很给力。

相关推荐

    lrucacheleetcode-LeetCode:本库有各种在线编码平台几个问题的解决方案

    lru缓存leetcode 力码 涵盖了 Geeks for Geeks 和 Leet Code 的各种问题。...LeetCode ...LeetCode ...LeetCode 3 ...LeetCode ...LeetCode ...LeetCode ...LeetCode ...LeetCode ...3Sum (271_Medium) LeetCode 17 : 电话号码的

    javalruleetcode-LeetCode::lollipop:个人LeetCode习题解答仓库-多语言

    leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode 题解仓库,欢迎交流学习。 下面的目录中 $number 题号代表经典 LeetCode 题目,$number.$number 题号表示 LeetCode 面试题。 :receipt: 目录 统计 值 AC 的...

    LeetCode:一步步!

    LeetCode :laptop: :check_mark_button: 一步步! LeetCode: ://leetcode.com/ ...16 3Sum最近 中等的 17 电话号码的字母组合 电话号码的17个字母组合 中等的 18岁 4和 18 4和 中等的 19 从列表末尾删除第N个节点

    leetcode.3sum-leetcode:创建此存储库是为了发布各种leetcode问题的解决方案

    3sum # Leetcode 解决方案以下是我在 Leetcode 上解决的一些问题,如果你喜欢/找到任何你的答案,请留下一个星。 如果你想与我联系,我在下面分享了我的 Linkedin URL。 问题 # 标题 # 解决方案 困难 1 二和 简单...

    2sumleetcode-leetcode:leetcode

    2Sum-&gt;3Sum(hash) 2Sum Less Than K-&gt;3Sum Closet-&gt;3Sum Smaller(两个指针接近) 找到重复的号码 两个指针: 链表循环 BF: DP: 数学: i^0=i;i^i=0 单号-&gt;单号2-&gt;单号3 n&n-1 例 12。 1 位数 13. 汉明距离 二...

    leetcode卡-leetcode:一些leetcode问题的解决方法,请注意license!

    Leetcode\TwoSum\TwoSum.cs 问题: 业绩报告: 反转整数 代码: Leetcode\ReverseInteger\ReverseInteger.cs 问题: 业绩报告: 回文数 代码: Leetcode\PalindromeNumber\PalindromeNumber.cs 问题: 从排序数组中...

    2sumleetcode-LeetCode:力码

    3sum2.cpp - 3sum.cpp - BST_from_preorder_traversal.cpp - 2sum.cpp - remove_adjacent_duplicates.cpp - 子集.cpp - 子集_2.cpp - Remove_Nth_Node_From_End_of_List.cpp - invert_Binary_Tree.cpp - 对称树.cpp ...

    leetcode分类-leetcode:leetcode问题的代码

    #3:Longest Substring Without Repeating Characters #5:Longest Palindromic Substring 链表 #2:Add Two Numbers 分而治之 #53:Maximum Subarray 队列/集 #3:Longest Substring Without Repeating Characters 优先...

    leetcode3sum-LeetCode:leetcode问题用C#解决

    3sum 力码 力扣算法 (注:“ :locked: " 表示你需要来自 Leetcode) # 标题 解决方案 困难 001 简单的 002 中等的 003 中等的 004 难的 005 中等的 006 简单的 007 简单的 008 简单的 009 简单的 010 难的 011 中等...

    leetcode打不开-leetcode:leetcode

    Tip3: Knapsack Problem (0/1, unbounded) (#DP 322. Coin Change) Tip4: backtrace or K sum remove duplicates if i != 0 and n == nums[i-1]: (#15. 3Sum) if idx &gt; start and nums[idx] == nums[idx-1]: ...

    0-leetcode:leetcode练习:twosum问题;addtwonumbers问题;reverse integer问题;最大不重复子字符串长度问题等,详细见readme.md;

    1. **Two Sum (两数之和)**: 这是LeetCode上的一个基础题目,要求在给定的整数数组中找到两个数,使得它们的和等于一个特定的目标值。这个题目主要涉及数组的遍历和哈希表的应用。在C++中,可以利用`unordered_map`...

    javalruleetcode-LeetCode:LeetCode算法问题

    Sum II - Input array is sorted LeetCode 344 Reverse String LeetCode 345 Reverse Vowels of a String 2 字符串 编号 题目 LeetCode 3 Longest Substring Without Repeating Characters LeetCode 13 Roman to ...

    leetcode1004-leetcode:leetcode

    leetcode 1004 力码 去做 : array , dynamic-programming : link , math : string , sliding-window : array , median : string : string : number , reverse , bit : string : math , bit : string , ...

    leetcode答案-leetcode:leetcode-问题

    https://leetcode-cn.com/problems/two-sum/ 难度 : 简单 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。...

    leetcode3sumnlogn-leetcode:leetcode

    3sum nlogn 编码问题 审查旧代码与早晨咖啡/茶搭配得很好;) Leetcode - DS & Alg : 链表,最小堆 : 二分查找 : 数组,动态规划 : 数组,Kadane 算法 : 树遍历 : 二叉树 : 二叉树 : 二叉树、队列、bfs : 字符串操作 ...

    gasstationleetcode-Leetcode:力码

    Leetcode\3Sum(15).swift Leetcode\k 站内最便宜的飞行(787).swift Leetcode\combination sum(39).swift Leetcode\count number of team(1395).swift Leetcode\counting bits(338).swift Leetcode \find 数组中的...

    leetcode2sumc-LeetCode:LeetCode题解

    sum c LeetCode:heart_suit: 好!!!!!!!!!!!!!!!!!!!! LeetCode 题解(C++实现)(持续更新中...) # Title Solution Difficulty label date 1 Easy 2 medium 3 medium 滑动窗口,hashmap 4 hard ...

    leetcode:leetcode记录

    这些文件通常以问题的ID或标题命名,例如“TwoSum.java”、“MergeIntervals.java”等,这有助于追踪和理解代码对应的具体问题。 在学习和使用这个压缩包时,你可以期待以下几个方面的知识收获: 1. 数据结构:...

Global site tag (gtag.js) - Google Analytics