*4sum
2015-06-05 07:08
429 查看
题目:
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.
使用挪动指针的方法来解决重复的代码如下:
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) 题解: 4 sum跟3 sum是一样的思路,只不过需要多考虑一个加数,这样时间复杂度变为O(n3)。 使用HashSet来解决重复问题的代码如下:
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) { HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>(); ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); Arrays.sort(num); for (int i = 0; i <= num.length-4; i++) { for (int j = i + 1; j <= num.length-3; j++) { int low = j + 1; int high = num.length - 1; while (low < high) { int sum = num[i] + num[j] + num[low] + num[high]; if (sum > target) { high--; } else if (sum < target) { low++; } else if (sum == target) { ArrayList<Integer> temp = new ArrayList<Integer>(); temp.add(num[i]); temp.add(num[j]); temp.add(num[low]); temp.add(num[high]); if (!hashSet.contains(temp)) { hashSet.add(temp); result.add(temp); } low++; high--; } } } } return result; }
使用挪动指针的方法来解决重复的代码如下:
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) { HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>(); ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); Arrays.sort(num); for (int i = 0; i <= num.length-4; i++) { if(i==0||num[i]!=num[i-1]){ for (int j = i + 1; j <= num.length-3; j++) { if(j==i+1||num[j]!=num[j-1]){ int low = j + 1; int high = num.length - 1; while (low < high) { int sum = num[i] + num[j] + num[low] + num[high]; if (sum > target) { high--; } else if (sum < target) { low++; } else if (sum == target) { ArrayList<Integer> temp = new ArrayList<Integer>(); temp.add(num[i]); temp.add(num[j]); temp.add(num[low]); temp.add(num[high]); if (!hashSet.contains(temp)) { hashSet.add(temp); result.add(temp); } low++; high--; while(low<high&&num[low]==num[low-1])//remove dupicate low++; while(low<high&&num[high]==num[high+1])//remove dupicate high--; } } } } } } return result; }
相关文章推荐
- 实战突击: Java Web项目整合开发(PDF)
- OSChina 周五乱弹 —— 谁来调调加班这个Bug
- bind client.c
- List总结(LinkedList, ArrayList等使用场景和性能分析) [From skywang12345 ]
- 猫猫学iOS 之微博项目实战(1)微博主框架-子控制器的添加
- java并发容器(Map、List、BlockingQueue)
- Servlet工作原理解析
- 嵌入式操作系统FreeRTOS的原理与实现
- SWF安全学习
- Jetty 的工作原理以及与 Tomcat 的比较
- 抱歉,因外出停更一周
- LinkedList: 详细介绍(源码解析)和使用示例 [From skywang12345]
- 久违了,北京!
- 2015-2016校历
- sliding window
- Haar分类器(人脸识别、人眼识别)
- Array: 常用Java操作
- Node.js 学习资源总结
- Simplify Path
- 我的调试输出 _TRACE 第三版