6.3Sum && 4Sum [ && K sum ] && 3Sum Closest
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)
解析:分三步: a.排序. b. 任取一个没取过的数,余下右边的序列中求 2Sum. c. 取2Sum的过程中,应保证没有重复。
// O(n^2 + nlogn) // no set used!
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > vec;
vector<int> vec2(3, 0);
int n = num.size();
if(n < 3) return vec;
sort(num.begin(), num.end());
/* promise not occur again */
int preValue = num[0] + 1;
for(int i = 0; i < n-2; ++i){
if(num[i] == preValue) continue;
else preValue = num[i];
/* 2Sum */
int j = i + 1, k = n-1;
while(j < k ){
int sum = num[j] + num[k] + num[i];
if(sum== 0){
vec2[0] = num[i]; vec2[1] = num[j]; vec2[2] = num[k];
while(j < k && num[j] == num[j+1]) ++j; // promise not occur again
while(j < k && num[k] == num[k-1]) --k;
vec.push_back(vec2);
++j,--k;
}else if(sum < 0){
++j;
} else --k;
}
}
return vec;
}
};
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)
解析:3Sum 之上加一层循环。
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int> > vec;
vector<int> ans(, ); // record one answer
int n = num.size();
if(n < ) return vec;
sort(num.begin(), num.end());
int preVal4 = num[] ^ 0x1;
for(int i = ; i < n - ; ++i){
if(num[i] == preVal4) continue;
else preVal4 = num[i];
int preVal3 = num[i+] ^ 0x1;
for(int j = i+; j < n - ; ++j){
if(num[j] == preVal3) continue;
else preVal3 = num[j];
int s = j + , t = n - , target2 = target - num[i] - num[j];
while(s < t){
int sum = num[s] + num[t];
if(sum == target2){
ans[] = num[i]; ans[] = num[j]; ans[] = num[s]; ans[] = num[t];
while(s < t && num[s] == num[s+]) ++s;
while(s < t && num[t] == num[t-]) --t;
vec.push_back(ans);
++s, --t;
}else if(sum < target2) {
++s;
}else --t;
}
}
}
return vec;
}
};
Code
kSum(刷题模版)
class Solution {
public:
vector<vector<int> > kSum(vector<int> &num,int k, int target) {
vector<vector<int> > vec;
vector<int> vec2;
if(num.size() < k) return vec;
sort(num.begin(), num.end());
getSum(vec, vec2, num, 0, k, target);
return vec;
} void getSum(vector<vector<int> > &vec, vector<int> &vec2, vector<int> &num, int begin, int k, int target){
if(k == 2){
int len = num.size(), s = begin, t = len - 1;
while(s < t){
int sum = num[s] + num[t];
if(sum == target){
vec2.push_back(num[s]); vec2.push_back(num[t]);
while(s < t && num[s] == num[s+1]) ++s;
while(s < t && num[t] == num[t-1]) --t;
vec.push_back(vec2);
vec2.pop_back(); vec2.pop_back(); // key
++s, --t;
}else if(sum < target) {
++s;
}else --t;
} }else {
int len = num.size();
int preValue = num[begin] ^ 0x1;
for(int start = begin; start < len-k+1; ++start){
if(num[start] == preValue) continue;
else preValue = num[start];
vec2.push_back(num[start]);
getSum(vec, vec2, num, start + 1, k - 1, target - num[start]);
vec2.pop_back();
}
}
}
};
算法复杂度分析:
k-SUM can be solved more quickly as follows.
For even k: Compute a sorted list S of all sums of k/2 input elements. Check whether S contains both some number x and its negation −x. The algorithm runs in O(nk/2logn) time.
For odd k: Compute the sorted list S of all sums of (k−1)/2 input elements. For each input element a, check whether S contains both x and a−x, for some number x. (The second step is essentially the O(n2)-time algorithm for 3SUM.) The algorithm runs in O(n(k+1)/2) time.
Both algorithms are optimal (except possibly for the log factor when k is even and bigger than 2) for any constant k in a certain weak but natural restriction of the linear decision tree model of computation.
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).
class Solution {
public:
int threeSumClosest(vector<int> &num, int target) {
int len = num.size();
if(len < 3){
printf("Number of elements is less than 3.\n");
return 0;
}
sort(num.begin(), num.end());
int minDiff = 0x7fffffff; // note: a = 0x80000000; abs(a) == -2147483648;
int preValue3 = num[0] + 1; // jump the number appeared again.
for(int i = 0; i < len - 2; ++i){
if(num[i] == preValue3) continue;
else preValue3 = num[i]; int s = i + 1, t = len - 1, temVal = num[i] - target;
while(s < t){
int curDiff = temVal + num[s] + num[t];
if(curDiff == 0) return target;
else if(curDiff < 0) ++s;
else --t; if(abs(curDiff) < abs(minDiff)) minDiff = curDiff;
}
}
return target + minDiff;
}
};
6.3Sum && 4Sum [ && K sum ] && 3Sum Closest的更多相关文章
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- LeetCode解题报告--2Sum, 3Sum, 4Sum, K Sum求和问题总结
前言: 这几天在做LeetCode 里面有2sum, 3sum(closest), 4sum等问题, 这类问题是典型的递归思路解题.该这类问题的关键在于,在进行求和求解前,要先排序Arrays.sor ...
- LeetCode Two Sum&Two Sum II - Input array is sorted&3Sum&4Sum 一锅煮题解
文章目录 Two Sum Two Sum II 3Sum 4Sum Two Sum 题意 给定一个数组,和指定一个目标和.从数组中选择两个数满足和为目标和.保证有且只有一个解.每个元素只可以用一次. ...
- k sum 问题系列
转自:http://tech-wonderland.net/blog/summary-of-ksum-problems.html (中文旧版)前言: 做过leetcode的人都知道, 里面有2sum, ...
- LeetCode之“散列表”:Two Sum && 3Sum && 3Sum Closest && 4Sum
1. Two Sum 题目链接 题目要求: Given an array of integers, find two numbers such that they add up to a specif ...
- K Sum(2 Sum,3 Sum,4 Sum,3-Sum Closest)
算是经典算法问题了.这里主要针对只存在一个解或者只需要求一个解的情况描述一下解题思路.若需要找到所有可能解,方法需要略作调整.如有问题,欢迎指正. 2 sum: 如果已排序,可直接用夹逼法,即两指针从 ...
- 2Sum,3Sum,4Sum,kSum,3Sum Closest系列
1).2sum 1.题意:找出数组中和为target的所有数对 2.思路:排序数组,然后用两个指针i.j,一前一后,计算两个指针所指内容的和与target的关系,如果小于target,i右移,如果大于 ...
- 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 ...
- lintcode: k Sum 解题报告
K SUM My Submissions http://www.lintcode.com/en/problem/k-sum/ 题目来自九章算法 13% Accepted Given n distinc ...
随机推荐
- java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
今天在使用动态代理时,遇到了如下问题,报错 java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice 下面是完整的报错信息: 一月 , :: ...
- BCG界面库下的Windows8 UI界面样式www.webui8.com
BCG界面库下的Windows8 UI界面样式(Metro风格)控件主要有以下一些功能: 规则的大块磁贴 支持完整键盘导航 Tile组 标题(Caption) 标题按钮(Caption buttons ...
- python 笔记1:安装python;eclipse中安装配置pydev
1 下载安装python. 官网:https://www.python.org/downloads/ 根据自己的操作系统选择需要的版本下载并安装. 我的电脑操作系统windows xp的,只 ...
- SDR 研究
最近终于买了一个RTL2832u 电视棒,可以软件无线电了 使用我的小米3开发板 (安卓6.0),直接在应用商店里搜索 "sdr",到豌豆荚中,就有“RTL驱动程序” 点击下载安装 ...
- cocos2dx 3.8版关于#include "GB2ShapeCache-x.h"
关于coco2d-x 3.8版的PhysicsEditor.exe1.09版的GB2ShapeCache-x.h.cpp中有些方法更新了和容器的使用方法,还有就是头文件include "CC ...
- SQLAlchemy一对多总结
1.SQLAlchemy之一对多关系 1.1 创建单表 class Test(Base): __tablename__ = 'user' nid = Colume(Integer,primary_ke ...
- Win10/UWP新特性系列—电池报告
UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的 ...
- Ubuntu12.04安装vscode i386
最近在Ubuntu12.04的32位版本上安装vscode,我下载的是32位deb包, vscode官网 安装命令 sudo dpkg -i vscode-i386.deb 安装完成没有报错,但是点 ...
- 用minidwep-gtk研究wifi
全图,不解释
- GridView与CheckBox完美结合
版本一:单纯地实现全选和全取消,http://www.cnblogs.com/insus/archive/2009/03/14/1411613.html 版本二:修改选中行的背景颜色,http://w ...