4sum [From 爱做饭的小莹子]

题目:

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, abcd)
  • 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)
 题解: 4 sum跟3 sum是一样的思路,只不过需要多考虑一个加数,这样时间复杂度变为O(n3)。使用HashSet来解决重复问题的代码如下:
 1 public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
 2     HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>();
 3     ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
 4     Arrays.sort(num);
 5     for (int i = 0; i <= num.length-4; i++) {
 6         for (int j = i + 1; j <= num.length-3; j++) {
 7             int low = j + 1;
 8             int high = num.length - 1;
 9
10             while (low < high) {
11                 int sum = num[i] + num[j] + num[low] + num[high];
12
13                 if (sum > target) {
14                     high--;
15                 } else if (sum < target) {
16                     low++;
17                 } else if (sum == target) {
18                     ArrayList<Integer> temp = new ArrayList<Integer>();
19                     temp.add(num[i]);
20                     temp.add(num[j]);
21                     temp.add(num[low]);
22                     temp.add(num[high]);
23
24                     if (!hashSet.contains(temp)) {
25                         hashSet.add(temp);
26                         result.add(temp);
27                     }
28
29                     low++;
30                     high--;
31                 }
32             }
33         }
34     }
35
36     return result;
37 }

使用挪动指针的方法来解决重复的代码如下:

 1 public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
 2     HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>();
 3     ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
 4     Arrays.sort(num);
 5     for (int i = 0; i <= num.length-4; i++) {
 6         if(i==0||num[i]!=num[i-1]){
 7             for (int j = i + 1; j <= num.length-3; j++) {
 8                 if(j==i+1||num[j]!=num[j-1]){
 9                     int low = j + 1;
10                     int high = num.length - 1;
11
12                     while (low < high) {
13                         int sum = num[i] + num[j] + num[low] + num[high];
14
15                         if (sum > target) {
16                             high--;
17                         } else if (sum < target) {
18                             low++;
19                         } else if (sum == target) {
20                             ArrayList<Integer> temp = new ArrayList<Integer>();
21                             temp.add(num[i]);
22                             temp.add(num[j]);
23                             temp.add(num[low]);
24                             temp.add(num[high]);
25
26                             if (!hashSet.contains(temp)) {
27                                 hashSet.add(temp);
28                                 result.add(temp);
29                             }
30
31                             low++;
32                             high--;
33
34                             while(low<high&&num[low]==num[low-1])//remove dupicate
35                                 low++;
36                             while(low<high&&num[high]==num[high+1])//remove dupicate
37                                 high--;
38                         }
39                     }
40                 }
41             }
42         }
43     }
44
45     return result;
46 }
时间: 2024-10-06 09:49:32

4sum [From 爱做饭的小莹子]的相关文章

HashTable HashMap HashSet区别(java) [From 爱做饭的小莹子]

Hashtable: 1. key和value都不许有null值 2. 使用enumeration遍历 3. 同步的,每次只有一个线程能够访问 4. 在java中Hashtable是H大写,t小写,而HashMap是H大写,M大写 HashMap: 1. key和value可以有null值 2. 使用iterator遍历 3. 未同步的,多线程场合要手动同步HashMap HashSet 1. 底层调用HashMap 2. 不允许有重复值 常用Java操作: 1 Hashtable<Intege

爱改名的小融 2(codevs 3149)

3149 爱改名的小融 2 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description Wikioi上有个人叫小融,他喜欢改名.现在他的要求变了,只要是英文字母就是他的名字.先给你N个名字,请你一一判断是不是小融.本题还加强了测试数据 输入描述 Input Description NN行名字(全部为字符) 输出描述 Output Description N行,YES或NO(大写) 样例输入 Sample Input 3&

iOS 版本分布: 7、8 已占 96% 的份额 - 是时侯统一而忽略小六子了

iOS 7.8 已占 96% 的份额 - 是时侯统一而忽略小六子了 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 据苹果官网 2014 年 12 月 8 日公布消息,iOS 7.8 已占 96

AC日记——爱改名的小融 codevs 2967

2967 爱改名的小融 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名. 他的名字都是英文,只要按顺序出现R,K,Y三个字母,就是他的名字. 给你N个名字,请你一一判断是不是小融. 输入描述 Input Description N N行,名字(全大写) 输出描述 Output Description N行,每行YES或NO(大写) 样例输入 Sample Input 3 RKY R

AC日记——爱改名的小融2 codevs 3149

3149 爱改名的小融 2 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名.现在他的要求变了,只要是英文字母就是他的名字.先给你N个名字,请你一一判断是不是小融.本题还加强了测试数据 输入描述 Input Description NN行名字(全部为字符) 输出描述 Output Description N行,YES或NO(大写) 样例输入 Sample Input 3&6*14315

AC日记——爱改名的小融3 codevs 3156

3156 爱改名的小融 3 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名.现在他的要求变了,只要是英文字母就是他的名字.先给你N个名字,请你输出正确名字的个数及编号.本题还加强了测试数据 输入描述 Input Description NN行名字(全部为字符) 输出描述 Output Description 第一行:个数第二行:编号 样例输入 Sample Input 3&6*143

codevs 3165 爱改名的小融2

3149 爱改名的小融 2 http://codevs.cn/problem/3149/ 题目描述 Description Wikioi上有个人叫小融,他喜欢改名.现在他的要求变了,只要是英文字母就是他的名字.先给你N个名字,请你一一判断是不是小融.本题还加强了测试数据 输入描述 Input Description NN行名字(全部为字符) 输出描述 Output Description N行,YES或NO(大写) 样例输入 Sample Input 3&6*14315Rinkementmics

爱改名的小融1

2967 爱改名的小融 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题解 题目描述 Description Wikioi上有个人叫小融,他喜欢改名. 他的名字都是英文,只要按顺序出现R,K,Y三个字母,就是他的名字. 给你N个名字,请你一一判断是不是小融. 输入描述 Input Description N N行,名字(全大写) 输出描述 Output Description N行,每行YES或NO(大写) 样例输入 Sample Input 3 RKY R

爱改名的小融

3149  爱改名的小融2 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Wikioi上有个人叫小融,他喜欢改名.现在他的要求变了,只要是英文字母就是他的名字.先给你N个名字,请你一一判断是不是小融.本题还加强了测试数据 输入描述 Input Description NN行名字(全部为字符) 输出描述 Output Description N行,YES或NO(大写) 样例输入 Sample Input 3&6*14315Rin