Given an array nums of n integers, are there elements abc 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]
]

Idea: Simplify this problem from O(n^3) to n square by using two pointers

iterate i and j = i+1 and k = n-1 (j and k are two pointers we would use)

class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<List<Integer>>();
//two pointers
//set i and move j and k (if sum <0 j++ else k--)
for(int i = 0; i<nums.length; i++){
if (i != 0 && nums[i] == nums[i - 1]) continue; //*****
int j = i+1;
int k = nums.length-1;
while(j<k){
if(nums[i] + nums[j] + nums[k] == 0){
List<Integer> temp = new ArrayList<Integer>();
temp.add(nums[i]); temp.add(nums[j]);temp.add(nums[k]);
//if(!res.contains(temp)) //why add this make TLE ****
res.add(temp);
++j;
//System.out.println("wei");
while (j < k && nums[j] == nums[j-1]) ++j; ****
}else if(nums[i] + nums[j] + nums[k] < 0){
j++;
}else {
k--;
}
}
}
return res;
}
}

1.avoid the duplicate elements -1 -1 (for the same values, there are same results)

2. avoid using contains because of O(n), that is the reason why we need check the duplicate elements manually instead of using contains

Solution 2: using hashmap: n^2*lgn

class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++){
if(i!=0 && nums[i-1] == nums[i]) continue;
Set<Integer> set = new HashSet<>(); // no duplicate elements
for(int j = i+1; j<nums.length; j++){// nums[j] : b and c means: count all nums[i] as c
if(set.contains(-nums[i]-nums[j])){ // c
List<Integer> temp = new ArrayList<>();
temp.add(nums[i]);temp.add(nums[j]);temp.add(-nums[i]-nums[j]);
res.add(temp);
//avoid the duplicate elemnts
++j;
while(j < nums.length && nums[j-1]==nums[j]) j++;
--j;
}
if(j<nums.length)
set.add(nums[j]);
}
}
return res;
}
}

hashset

how to using two loop to represent three numbers.

1. treat all nums[j] as c(the third elemnts)

2. As a+b+c = 0, c = -a-b, we need find a and b to satisfy the requirement

Great reference: https://fizzbuzzed.com/top-interview-questions-1/#twopointer -- speak human language nice.

*15. 3Sum (three pointers to two pointers), hashset的更多相关文章

  1. leetcode 15. 3Sum 二维vector

    传送门 15. 3Sum My Submissions Question Total Accepted: 108534 Total Submissions: 584814 Difficulty: Me ...

  2. LeetCode 15 3Sum [sort] <c++>

    LeetCode 15 3Sum [sort] <c++> 给出一个一维数组,找出其中所有和为零的三元组(元素集相同的视作同一个三元组)的集合. C++ 先自己写了一发,虽然过了,但跑了3 ...

  3. 1. Two Sum&&15. 3Sum&&18. 4Sum

    题目: 1. Two Sum Given an array of integers, return indices of the two numbers such that they add up t ...

  4. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

  5. 15. 3Sum、16. 3Sum Closest和18. 4Sum

    15 3sum Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = ...

  6. 刷题15. 3Sum

    一.题目说明 题目非常简洁15. 3Sum,读懂题目后,理解不难. 但 实话说,我们提交代码后,Time Limit Exceeded,最主要的是给了非常长的测试用例,我本地运行后87秒,确实时间非常 ...

  7. LeetCode 15. 3Sum(三数之和)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  8. [leetcode]15. 3Sum三数之和

    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...

  9. 蜗牛慢慢爬 LeetCode 15. 3Sum [Difficulty: Medium]

    题目 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...

随机推荐

  1. [CF1051F]The Shortest Statement (LCA+最短路)(给定一张n个点m条有权边的无向联通图,q次询问两点间的最短路)

    题目:给定一张n个点m条有权边的无向联通图,q次询问两点间的最短路 n≤100000,m≤100000,m-n≤20. 首先看到m-n≤20这条限制,我们可以想到是围绕这个20来做这道题. 即如果我们 ...

  2. 2.1 GO 变量定义

    GO有四种数据类型,数字.布尔.字符.派生类型:这里使用前三种简单类型来说明变量的定义与使用 package main import "fmt" var ( aa = 1 bb = ...

  3. sf01_什么是数据结构

    数据结构解决什么问题 如何在计算机中存储数据和信息,采用什么样的方法和技巧加工处理这些数据,都是数据结构需要努力解决的问题. 解决问题的步骤 使用计算机解决问题的步骤:分析具体问题得到数学模型,设计解 ...

  4. js中的内置对象

    在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变量(如var i="aaa"),所有变量都有对象的性质.注意:通过字面量创建的对象在调用属性和 ...

  5. hadoop和spark比较

    http://blog.51cto.com/13943588/2165946 3.hadoop和spark的都是并行计算,那么他们有什么相同和区别?  两者都是用mr模型来进行并行计算,hadoop的 ...

  6. execlp启动android进程命令

    execlp启动Android界面或service/广播参数设置 -n代表打开组件-d代表 data-a代表action 打开网页 调用am命令 if (sdkVersion >= 17) { ...

  7. 电感的Q值

    电感的Q值又称为品质因数,即在通过一定频率信号时,感抗与等效损耗之比.品质因数越高即系统损耗越小效率越高,一般为50`100,最高500左右,再大就会烧毁.一般Q值与很多因素有关:绕线粗细,长度与直径 ...

  8. suffix ACM-ICPC 2017 Asia Qingdao

    Consider n given non-empty strings denoted by s1 , s2 , · · · , sn . Now for each of them, you need ...

  9. Python LoggerAdpater类

    Logger子类: import logging # create loggermodule_logger = logging.getLogger('spam_application.auxiliar ...

  10. 深入学习webpack(四)

    更多内容可以看此文档.