leetcode: 哈希——two-sum,3sum,4sum
1). two-sum
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
思路一: 暴力搜索,时间复杂度O(n*n);
思路二:Map
- public class Solution{
- public int[] twoSum(int[] numbers,int target){
- int len=numbers.length;
- int[] index=new int[2];
- HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
- for(int i=0;i<numbers.length;i++){
- if(!map.containsKey(numbers[i]){
- map.put(target-numbers[i],i);
- }else{
- index[0]=map.get(numbers[i]);
- index[1]=i;
- }
- }
- return index;
- }
- }
2). 3sum
Given an array S of n integers, are there elements a, b, c 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)
思路一:三重循环,时间复杂度是O(n^3),而且还要处理重复的问题;
思路二:
先升序排序,然后用第一重for循环确定第一个数字。然后在第二重循环里,第二、第三个数字分别从两端往中间扫。如果三个数的sum等于0,得到一组解。如果三个数的sum小于0,说明需要增大,所以第二个数往右移。如果三个数的sum大于0,说明需要减小,所以第三个数往左移。时间复杂度:O(n2)
注意:
1、排序之后天然满足non-descending order的要求
2、为了避免重复,在没有空间要求情况下可以用map,但是也可以跳过重复元素来做。
- public class Solution {
- public List<List<Integer>> threeSum(int[] num) {
- List<List<Integer>> ret = new ArrayList<List<Integer>>();
- int len = num.length, tar = 0;
- if (len <= 2)
- return ret;
- Arrays.sort(num);
- for (int i = 0; i <= len - 3; i++) {
- // first number : num[i]
- int j = i + 1; // second number
- int k = len - 1; // third number
- while (j < k) {
- if (num[i] + num[j] + num[k] < tar) {
- ++j;
- } else if (num[i] + num[j] + num[k] > tar) {
- --k;
- } else {
- ret.add(Arrays.asList(num[i], num[j], num[k]));
- ++j;
- --k;
- // folowing 3 while can avoid the duplications
- while (j < k && num[j] == num[j - 1])
- ++j;
- while (j < k && num[k] == num[k + 1])
- --k;
- }
- }
- while (i <= len - 3 && num[i] == num[i + 1])
- ++i;
- }
- return ret;
- }
- }
3).4sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b+ c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
- For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
- A solution set is:
- (-1, 0, 0, 1)
- (-2, -1, 1, 2)
- (-2, 0, 0, 2)
思路一:跟之前的 2Sum, 3Sum 一样的做法,先排序,再左右夹逼
思路二: 先求出每两个数的和,放到 HashSet
里,再利用之前的 2Sum 去求。这种算法比较快,复杂度 O(nnlog(n)),不过细节要处理的不少。
- public class Solution {
- public List<List<Integer>> fourSum(int[] num, int target) {
- List<List<Integer>> ret = new ArrayList<List<Integer>>();
- HashMap<Integer, List<Integer[]>> hm = new HashMap<Integer, List<Integer[]>>();
- int len = num.length;
- Arrays.sort(num);
- // store pair
- for (int i = 0; i < len - 1; ++i) {
- for (int j = i + 1; j < len; ++j) {
- int sum = num[i] + num[j];
- Integer[] tuple = {num[i], i, num[j], j};
- if (!hm.containsKey(sum)) {
- hm.put(sum, new ArrayList<Integer[]>());
- }
- hm.get(sum).add(tuple);
- }
- }
- Integer[] keys = hm.keySet().toArray(new Integer[hm.size()]);
- for (int key : keys) {
- if (hm.containsKey(key)) {
- if (hm.containsKey(target - key)) {
- List<Integer[]> first_pairs = hm.get(key);
- List<Integer[]> second_pairs = hm.get(target - key);
- for (int i = 0; i < first_pairs.size(); ++i) {
- Integer[] first = first_pairs.get(i);
- for (int j = 0; j < second_pairs.size(); ++j) {
- Integer[] second = second_pairs.get(j);
- // check
- if (first[1] != second[1] && first[1] != second[3] &&
- first[3] != second[1] && first[3] != second[3]) {
- List<Integer> ans = Arrays.asList(first[0], first[2], second[0], second[2]);
- Collections.sort(ans);
- if (!ret.contains(ans)) {
- ret.add(ans);
- }
- }
- }
- }
- hm.remove(key);
- hm.remove(target - key);
- }
- }
- }
- return ret;
- }
- }
leetcode: 哈希——two-sum,3sum,4sum的更多相关文章
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- LeetCode Two Sum&Two Sum II - Input array is sorted&3Sum&4Sum 一锅煮题解
文章目录 Two Sum Two Sum II 3Sum 4Sum Two Sum 题意 给定一个数组,和指定一个目标和.从数组中选择两个数满足和为目标和.保证有且只有一个解.每个元素只可以用一次. ...
- LeetCode 2 Add Two Sum 解题报告
LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...
- leetcode 练习1 two sum
leetcode 练习1 two sum whowhoha@outlook.com 问题描述 Given an array of integers, return indices of the tw ...
- [LeetCode] Minimum Size Subarray Sum 解题思路
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- 【一天一道LeetCode】#113. Path Sum II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 【一天一道LeetCode】#40. Combination Sum II
一天一道LeetCode系列 (一)题目 Given a collection of candidate numbers (C) and a target number (T), find all u ...
- 乘风破浪:LeetCode真题_040_Combination Sum II
乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...
- 乘风破浪:LeetCode真题_039_Combination Sum
乘风破浪:LeetCode真题_039_Combination Sum 一.前言 这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...
- 【LeetCode】813. Largest Sum of Averages 解题报告(Python)
[LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
随机推荐
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_CLR
1.CLR简介 全称:Common Language Runtime(公共语言进行时) 属性:一种托管模块 使用对象:面向CLR的所有语言(C#.Basic.IL...) 核心功能:内存管理.程序集加 ...
- 处女座和小姐姐(三)(数位dp)
链接:https://ac.nowcoder.com/acm/contest/329/G 来源:牛客网 题目描述 经过了选号和漫长的等待,处女座终于拿到了给小姐姐定制的手环,小姐姐看到以后直呼666! ...
- hdu6397 Character Encoding 隔板法+容斥原理+线性逆元方程
题目传送门 题意:给出n,m,k,用m个0到n-1的数字凑出k,问方案数,mod一个值. 题目思路: 首先如果去掉数字范围的限制,那么就是隔板法,先复习一下隔板法. ①k个相同的小球放入m个不同的盒子 ...
- 找到一篇关于 Oracle 全文检索实践 的文章
http://www.iteye.com/topic/1118055 有详细的例子记录了Oracle 全文检索的使用.
- Go语言基础之19--web编程基础
一.web编程基础 1.1 web工作方式 1.2 HTTP协议详解 a.http 请求包体 GET /domains/example/ HTTP/1.1 //请求行: 请求方法 请求URI HTTP ...
- restTemplate使用
转载博主: https://blog.csdn.net/itguangit/article/details/78825505 https://www.cnblogs.com/zhaoyan001/p/ ...
- ls -ilh 查看文件属性
属性信息[H0f@localhost ~]$ ls -hiltotal 12K139323 -rw-rw-r--. 1 H0f H0f 7 Mar 14 00:49 1.txt139318 -r ...
- linux面试题:删除一个目录下的所有文件,但保留一个指定文件
面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10 十个文件 [root@oldboy xx]# touch ...
- spring boot——关于一个Mysql主键的问题
问题是这样的: 我现在有一个被@Entity标记的类TimeLine,其中id为主键. TimeLineController中有一个接收post请求的add()方法,这个方法会接受客户端传来的一个表单 ...
- vue的watch详细用法
https://www.cnblogs.com/shiningly/p/9471067.html https://www.jb51.net/article/139282.htm