[算法]K-SUM problem
一、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.
For example:
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
Naive Approach
This problem is pretty straightforward. We can simply examine every possible pair of numbers in this integer array.
Time complexity in worst case: O(n^2).
1: public static int[] twoSum(int[] numbers, int target) {2: int[] ret = new int[2];3: for (int i = 0; i < numbers.length; i++) {4: for (int j = i + 1; j < numbers.length; j++) {5: if (numbers[i] + numbers[j] == target) {6: ret[0] = i + 1;7: ret[1] = j + 1;8: }9: }10: }11: return ret;12: }
Better Solution
Use HashMap to store the target value.
1: public class Solution {2: public int[] twoSum(int[] numbers, int target) {3: HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();4: int[] result = new int[2];5: for (int i = 0; i < numbers.length; i++) {6: if (map.containsKey(numbers[i])) {7: int index = map.get(numbers[i]);8: result[0] = index+1 ;9: result[1] = i+1;10: break;11: } else {12: map.put(target - numbers[i], i);13: }14: }15: return result;16: }17: }
Time complexity depends on the put and get operations of HashMap which is normally O(1).
Time complexity of this solution is O(n).
二、Two Sum II– Input array is sorted
This problem is similar to Two Sum.But the input array is sorted.
To solve this problem, we can use two points to scan the array from both sides. See
Java solution below:
1: public int[] twoSum(int[] numbers, int target) {2: if (numbers == null || numbers.length == 0)3: return null;4:5: int i = 0;6: int j = numbers.length - 1;7:8: while (i < j) {9: int x = numbers[i] + numbers[j];10: if (x < target) {11: ++i;12: } else if (x > target) {13: j--;14: } else {15: return new int[] { i + 1, j + 1 };16: }17: }18:19: return null;20: }
三、Two Sum III - Data structure design
Design and implement a TwoSum class. It should support the following operations: add and find.
add - Add the number to an internal data structure.
find - Find if there exists any pair of numbers which sum is equal to the value.
For example,
add(1);
add(3);
add(5);
find(4) -> true
find(7) –> false
Java Solution
Since the desired class need add and get operations, HashMap is a good option for this purpose.
1: public class TwoSum {2: private HashMap<Integer, Integer> elements = new HashMap<Integer, Integer>();3:4: public void add(int number) {5: if (elements.containsKey(number)) {6: elements.put(number, elements.get(number) + 1);7: } else {8: elements.put(number, 1);9: }10: }11:12: public boolean find(int value) {13: for (Integer i : elements.keySet()) {14: int target = value - i;15: if (elements.containsKey(target)) {16: if (i == target && elements.get(target) < 2) {17: continue;18: }19: return true;20: }21: }22: return false;23: }24: }
四、3Sum
Problem:
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)
1. Naive Solution
Naive solution is 3 loops, and this gives time complexity O(n^3). Apparently this is not an acceptable solution, but a discussion can start from here.
1: public class Solution {2: public ArrayList<ArrayList<Integer>> threeSum(int[] num) {3: //sort array4: Arrays.sort(num);5:6: ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();7: ArrayList<Integer> each = new ArrayList<Integer>();8: for(int i=0; i<num.length; i++){9: if(num[i] > 0) break;10:11: for(int j=i+1; j<num.length; j++){12: if(num[i] + num[j] > 0 && num[j] > 0) break;13:14: for(int k=j+1; k<num.length; k++){15: if(num[i] + num[j] + num[k] == 0) {16:17: each.add(num[i]);18: each.add(num[j]);19: each.add(num[k]);20: result.add(each);21: each.clear();22: }23: }24: }25: }26:27: return result;28: }29: }
* The solution also does not handle duplicates. Therefore, it is not only time inefficient, but also incorrect.
Result:
Submission Result: Output Limit Exceeded
2. Better Solution
A better solution is using two pointers instead of one. This makes time complexity of O(n^2).
To avoid duplicate, we can take advantage of sorted arrays, i.e., move pointers by >1 to use same element only once.
1: public ArrayList<ArrayList<Integer>> threeSum(int[] num) {2: ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();3:4: if (num.length < 3)5: return result;6:7: // sort array8: Arrays.sort(num);9:10: for (int i = 0; i < num.length - 2; i++) {11: //avoid duplicate solutions12: if (i == 0 || num[i] > num[i - 1]) {13:14: int negate = -num[i];15:16: int start = i + 1;17: int end = num.length - 1;18:19: while (start < end) {20: //case 121: if (num[start] + num[end] == negate) {22: ArrayList<Integer> temp = new ArrayList<Integer>();23: temp.add(num[i]);24: temp.add(num[start]);25: temp.add(num[end]);26:27: result.add(temp);28: start++;29: end--;30: //avoid duplicate solutions31: while (start < end && num[end] == num[end + 1])32: end--;33:34: while (start < end && num[start] == num[start - 1])35: start++;36: //case 237: } else if (num[start] + num[end] < negate) {38: start++;39: //case 340: } else {41: end--;42: }43: }44:45: }46: }47:48: return result;49: }
五、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)
Thoughts
A typical k-sum problem. Time is N to the power of (k-1).
Java Solution
1: public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {2: Arrays.sort(num);3:4: HashSet<ArrayList<Integer>> hashSet = new HashSet<ArrayList<Integer>>();5: ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();6:7: for (int i = 0; i < num.length; i++) {8: for (int j = i + 1; j < num.length; j++) {9: int k = j + 1;10: int l = num.length - 1;11:12: while (k < l) {13: int sum = num[i] + num[j] + num[k] + num[l];14:15: if (sum > target) {16: l--;17: } else if (sum < target) {18: k++;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[k]);24: temp.add(num[l]);25:26: if (!hashSet.contains(temp)) {27: hashSet.add(temp);28: result.add(temp);29: }30:31: k++;32: l--;33: }34: }35: }36: }37:38: return result;39: }
Here is the hashCode method of ArrayList. It makes sure that if all elements of two lists are the same, then the hash code of the two lists will be the same. Since each element in the ArrayList is Integer, same integer has same hash code.
1: int hashCode = 1;2: Iterator<E> i = list.iterator();3: while (i.hasNext()) {4: E obj = i.next();5: hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());6: }
六、3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
Analysis
This problem is similar to 2 Sum. This kind of problem can be solved by using a similar approach, i.e., two pointers from both left and right.
Java Solution
1: public int threeSumClosest(int[] nums, int target) {2: int min = Integer.MAX_VALUE;3: int result = 0;4: Arrays.sort(nums);5: for (int i = 0; i < nums.length; i++) {6: int j = i + 1;7: int k = nums.length - 1;8: while (j < k) {9: int sum = nums[i] + nums[j] + nums[k];10: int diff = Math.abs(sum - target);11: if(diff == 0) return sum;12: if (diff < min) {13: min = diff;14: result = sum;15: }16: if (sum <= target) {17: j++;18: } else {19: k--;20: }21: }22: }23:24: return result;25: }
Time Complexity is O(n^2).
[算法]K-SUM problem的更多相关文章
- summary of k Sum problem and solutions in leetcode
I found summary of k Sum problem and solutions in leetcode on the Internet. http://www.sigmainfy.com ...
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- k sum 问题系列
转自:http://tech-wonderland.net/blog/summary-of-ksum-problems.html (中文旧版)前言: 做过leetcode的人都知道, 里面有2sum, ...
- LeetCode解题报告--2Sum, 3Sum, 4Sum, K Sum求和问题总结
前言: 这几天在做LeetCode 里面有2sum, 3sum(closest), 4sum等问题, 这类问题是典型的递归思路解题.该这类问题的关键在于,在进行求和求解前,要先排序Arrays.sor ...
- lintcode: k Sum 解题报告
K SUM My Submissions http://www.lintcode.com/en/problem/k-sum/ 题目来自九章算法 13% Accepted Given n distinc ...
- HDu 1001 Sum Problem 分类: ACM 2015-06-19 23:38 12人阅读 评论(0) 收藏
Sum Problem Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HD2058The sum problem
The sum problem Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- Maxmum subsequence sum problem
We have a lot of ways to solve the maximum subsequence sum problem, but different ways take differen ...
- NYOJ--927--dfs--The partial sum problem
/* Name: NYOJ--927--The partial sum problem Author: shen_渊 Date: 15/04/17 19:41 Description: DFS,和 N ...
- 动态规划法(三)子集和问题(Subset sum problem)
继续讲故事~~ 上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定.之后,他就决心去大城市闯荡了,看一看外面更大的世界. 这天,丁丁刚回到家,他 ...
随机推荐
- oracle数据库权限管理
权限管理: oracle 9里面默认的三个username和password: sys change_on_install //权限最高的管理员 system manager //普通的管理员 sco ...
- PHP接收和发送XML数据(json也通用)
一.接收xml数据, 使用php://input,代码如下: <?php $xmldata=file_get_contents("php://input"); $data=s ...
- 一家O2O社区App公司的随笔
近两年,O20是业内最火爆的关键词之一,去年拿到1亿天使投资的叮咚小区都引起了各方的关注. 一个月之前我入职了一家以做O2O社区产品的创业公司,此文会把这段时间和后边所见所想都写出来,总结创业公司和创 ...
- 利用socket.io实现消息实时推送
最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞.评论.关注等操作时,需要由服务器向用户实时地推送一条消息.最终完成的项目地址为:socket-message-push,这里 ...
- Linux3_文件系统
1.Linux发行版本之间的差别很少,差别主要表现在系统管理的特色工具以及软件包管理方式的不同.目录结构基本上都是一样的. Windows的文件结构是多个并列的树状结构,最顶部的是不同的磁盘(分区), ...
- 转载:Python 包管理工具解惑
Python 包管理工具解惑 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供m ...
- hdu3293(pell方程+快速幂)
裸的pell方程. 然后加个快速幂. No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: ...
- 爬虫入门【7】Python-文件的读写和JSON
文本文档的读写 最重要的open()方法将返回一个file对象,经常使用的两个参数为open(filename,mode) 其中,filename为file保存的地址,可以是本地地址,相对地址或者绝对 ...
- android菜鸟学习笔记22----ContentProvider(二)ContentObserver的简单使用
现在有这样一个应用A通过ContentProvider提供自己的数据给其他应用,应用B通过ContentResolver获取应用A中提供的数据,并将其展示在ListView中,而应用C通过Conten ...
- POJ 2092 Grandpa is Famous【水---找出现第二多的数】
链接: http://poj.org/problem?id=2092 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27454#probl ...