LeetCode:3Sum

转载 2018年04月16日 19:47:11

题目链接:https://leetcode.com/problems/3sum/description/

项目源码:https://github.com/haha174/daylx
假设3sum问题的目标是target。每次从数组中选出一个数k,从剩下的数中求目标等于target-k的2sum问题。这里需要注意的是有个小的trick:当我们从数组中选出第i数时,我们只需要求数值中从第i+1个到最后一个范围内字数组的2sum问题。假设数组为A[],总共有n个元素A1,A2….An。很显然,当选出A1时,我们在子数组[A2~An]中求目标位target-A1的2sum问题,我们要证明的是当选出A2时,我们只需要在子数组[A3~An]中计算目标位target-A2的2sum问题,而不是在子数组[A1,A3~An]中,证明如下:

假设在子数组[A1,A3~An]目标位target-A2的2sum问题中,存在A1 + m = target-A2(m为A3~An中的某个数),即A2 + m = target-A1,这刚好是“对于子数组[A2~An],目标为target-A1的2sum问题”的一个解。即我们相当于对满足3sum的三个数A1+A2+m = target重复计算了。因此为了避免重复计算,在子数组[A1,A3~An]中,可以把A1去掉,再来计算目标是target-A2的2sum问题。

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

【LeetCode】3Sum 解题报告

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

[LeetCode] 3Sum分析与C/C++解法

前言3Sum算是LeetCode最经典的十几道题之一了,据说在面试中出现的频率相当高。所以在这里花点篇幅讨论一下此题。题目https://leetcode.com/problems/3sum/ Gi...
  • allenzyoung
  • allenzyoung
  • 2016-03-08 21:23:37
  • 300

LeetCode 15 3Sum (C,C++,Java,Python)

Problem: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...
  • runningtortoises
  • runningtortoises
  • 2015-05-09 21:06:57
  • 4344

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

[LeetCode] 015. 3Sum (Medium) (C++/Java/Python)
  • hcbbt
  • hcbbt
  • 2015-03-03 18:53:30
  • 2993

[leetcode javascript解题]3Sum

leetcode 第15题”3Sum”描述如下: Given an array S of n integers, are there elements a, b, c in S such that...
  • zzxboy1
  • zzxboy1
  • 2016-12-20 15:39:24
  • 787

leetcode 3sum c语言

c语言版本我只是写出了输出版本,由于对c的二维指针内存分配不是很清楚,所以没有按照题目上规定定义函数。 如果有人看到能帮我修改一下最好了,欢迎留言。 思路: 1,先按照由小到大把数组排序 2,...
  • way88liu
  • way88liu
  • 2015-07-10 09:59:31
  • 867

[LeetCode]3Sum

题目要求如下: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...
  • zhouworld16
  • zhouworld16
  • 2013-11-24 11:20:37
  • 7501

[LeetCode]15.3Sum

【题目】 3Sum  Total Accepted: 6032 Total Submissions: 35898My Submissions Given an array S of...
  • SunnyYoona
  • SunnyYoona
  • 2014-01-18 11:08:15
  • 3340

leetcode--ksum问题--3sum

【题目】:点击打开链接 Given an array S of n integers, are there elements a, b, c in S such that a + b + c...
  • sloanqin
  • sloanqin
  • 2016-07-17 22:08:28
  • 2356

LeetCode 15 - 3Sum

一、问题描述 Description:Description: Given an array S of n integers, are there elements a, b, c ...
  • lisong694767315
  • lisong694767315
  • 2015-05-19 20:03:13
  • 3716
收藏助手
不良信息举报
您举报文章:LeetCode:3Sum
举报原因:
原因补充:

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