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)

题解:把3Sum转换成2Sum,然后解决2Sum问题。

对于num中任意一个数num[i],我们要在i+1~num.length-1之间寻找两个数使得它们的和为0-num[i]。

而寻找两个数使得它们的和为0-num[i],我们可以设定两个指针start和last,我们知道在start+1~last之间我们要寻找的数是0-num[i]-num[start],这样三个数的和就是0了。所以如果

  • last所指向的数比0-num[i]-num[start]大,我们把last指针往前移动;
  • 如果比0-num[i]-num[start]小,我们把start指针往后移动(last指针不动是因为我们已经搜索过了可能和last指针后面组成答案的数,这些数在start之前);
  • 如果相等,就把num[i],num[start]和num[last]三个数依次放在list中作为一组答案。然后越过start后面和start相等的数,继续循环。

图示如下:

例如题目的数组排序后得到{-4,-1,0,1,2},当i指向-1的时候,我们需要在{0,1,2}之中找到两个数和为0-(-1)=1,把start指向0,last指向2,那么我们接下来要利用last找到1,last目前指向2,比需要的数1大,所以前移last,wala,我们找到了需要的1,同时找到了一组答案[-1,0,1]。

去重的工作十分简单,除了上述说的越过start后面和start相等的数外,在最外层的for循环的时候,如果num[i] = num[i-1],那么也可以越过i。

最后代码如下:

 public class Solution {
public List<List<Integer>> threeSum(int[] num) {
List<List<Integer>> answer = new ArrayList<List<Integer>>();
if(num == null || num.length == 0)
return answer;
Arrays.sort(num); for(int i = 0;i < num.length;i++){
       //remove duplicates
if(i != 0 && num[i] == num[i-1])
continue;
int twoSum = 0 - num[i];
int start = i + 1;
int last = num.length-1;
while(start < last){
int OneSum = twoSum - num[start];
         //Found one solution
if(num[last] == OneSum){
ArrayList<Integer> result = new ArrayList<Integer>();
result.add(num[i]);
result.add(num[start]);
result.add(num[last]);
answer.add(result);
start++;
last--;
           //remove duplicates
while(start < last && num[start] == num[start-1])
start++;
}
else if(num[last] > OneSum)
{
last--;
}
else{
start++;
}
}
} return answer;
}
}

【leetcode刷题笔记】3Sum的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. 【leetcode刷题笔记】3Sum Closest

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  6. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  7. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

  8. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  9. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

随机推荐

  1. Docker在Centos下使用Dockerfile构建远程Tomcat和Jenkins镜像

    镜像构建准备环境原料 构建CentOS Docker tomcat镜像 Dockerfile文件内容: FROM centos:latest MAINTAINER boonya <boonya@ ...

  2. jsp页面JSTL标签 <c:fn:>

    函数名 函数说明 使用举例 fn:contains 判断字符串是否包含另外一个字符串 <c:if test="${fn:contains(name, searchString)}&qu ...

  3. Weka关联规则分析

    购物篮分析: Apriori算法: 参数设置: 1.car 如果设为真,则会挖掘类关联规则而不是全局关联规则. 2. classindex 类属性索引.如果设置为-1,最后的属性被当做类属性. 3. ...

  4. delphi 无边框窗体常见问题

    实现无边框窗体很简单,直接将窗体的BorderStyle属性设置为bsNone即可.但是这样会引起2个问题: 1.在xp系统下,任务栏鼠标右键点击无法弹出菜单 解决办法:在FormShow中加入这个过 ...

  5. Sphinx(Coreseek)安装和使用指南

    1.安装 1.1安装mmseg ./bootstrap # 必须执行,不然安装会失败 ./configure --prefix=/usr/local/mmseg- #指定安装目录 make make ...

  6. 【Mac系统】之破解Navicat Premium for Mac(中文版)

    前期准备工作: 下载Mac中文版本: 下载地址:链接:https://pan.baidu.com/s/1wShOFK9odsSWBSphgqTdEQ  密码:ipsa 下载完成后进行安装,安装步骤省略 ...

  7. ActiveMQ与xml rpc

    最近项目在做平台间的消息传递,也让我对平台间消息的传递进行了深一步的探讨.先叙述一下概况 公司上一个版本用的是winform做的监控软件,主要做设备的通信和控制,基本的连接如下

  8. Android实现点击通知栏后,先启动应用再打开目标Activity ,极光推送等推送的也可以参考一下(转)

    我因为项目中集成了极光推送,推送的通知栏点开需要确定进入哪个界面就参考了这边文章,感谢作者的无私. 标签: 情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Servi ...

  9. python 线程安全

    http://www.cnblogs.com/monsteryang/p/6592385.html

  10. 嵌入式开发之qt socket--- qt 封装的socket demo

    http://wuyuans.com/2013/03/qt-socket/ http://blog.chinaunix.net/uid-22480862-id-388253.html