3Sum Closest从数列中找到三个数之和最接近给定值
2014-12-04 21:21
176 查看
即求min{ target - a -b -c } a,b,c blog to Set S;
(一)最简单的做法当然是求出所有的不相同的三个数和,保存到set里,然后用target,target (+/-) i ,i [0....]
复杂度基本上可以算是O(n^3)。
int threeSumClosest(vector<int> &num, int target) {
int n=num.size();
if(n<3) return 0;
unordered_set<int> sum;
for(int i=0 ; i<n; ++i)
for(int j=i+1;j<n; ++j)
for(int k=j+1; k<n;++k){
int key = num[i]+num[j]+num[k];
sum.insert(key);
}
int lap=0;
while(true){
if(sum.find(target+lap)!=sum.end()) return target+lap;
else if (sum.find(target-lap)!=sum.end()) return target-lap;
lap++;
}
}
(二)有了简单解法,我们自然要优化。
(1)三重循环肯定是可以干掉的,即先把两数之和和它们对应的下标存到map里。
(2)然后再用数组的数去map里映射,最初是a[i] +0 , 然后是a[i] +1 ,依次增加,总会找到的。
(3)这样基本上算是O(N^2)了。
int threeSumClosest(vector<int> &num, int target) {
int n=num.size();
if(n<3) return 0;
unordered_map<int,pair<int,int>> num0;
for(int i=0 ; i<n; ++i)
for(int j=i+1;j<n; ++j){
int key = target-num[i]-num[j];
num0.insert(make_pair(key,make_pair(i,j)));
}
int lap=0;
while(true){
for(int i=0 ; i< num.size();++i){
if( num0.find(num[i]+lap)!=num0.end()
&& i!=num0[num[i]+lap].first
&&i!=num0[num[i]+lap].second
)
return target-lap;
else if(num0.find(num[i]-lap)!=num0.end()
&& i!=num0[num[i]-lap].first
&&i!=num0[num[i]-lap].second
)
return target+lap;
}
lap++;
}
}
(一)最简单的做法当然是求出所有的不相同的三个数和,保存到set里,然后用target,target (+/-) i ,i [0....]
复杂度基本上可以算是O(n^3)。
int threeSumClosest(vector<int> &num, int target) {
int n=num.size();
if(n<3) return 0;
unordered_set<int> sum;
for(int i=0 ; i<n; ++i)
for(int j=i+1;j<n; ++j)
for(int k=j+1; k<n;++k){
int key = num[i]+num[j]+num[k];
sum.insert(key);
}
int lap=0;
while(true){
if(sum.find(target+lap)!=sum.end()) return target+lap;
else if (sum.find(target-lap)!=sum.end()) return target-lap;
lap++;
}
}
(二)有了简单解法,我们自然要优化。
(1)三重循环肯定是可以干掉的,即先把两数之和和它们对应的下标存到map里。
(2)然后再用数组的数去map里映射,最初是a[i] +0 , 然后是a[i] +1 ,依次增加,总会找到的。
(3)这样基本上算是O(N^2)了。
int threeSumClosest(vector<int> &num, int target) {
int n=num.size();
if(n<3) return 0;
unordered_map<int,pair<int,int>> num0;
for(int i=0 ; i<n; ++i)
for(int j=i+1;j<n; ++j){
int key = target-num[i]-num[j];
num0.insert(make_pair(key,make_pair(i,j)));
}
int lap=0;
while(true){
for(int i=0 ; i< num.size();++i){
if( num0.find(num[i]+lap)!=num0.end()
&& i!=num0[num[i]+lap].first
&&i!=num0[num[i]+lap].second
)
return target-lap;
else if(num0.find(num[i]-lap)!=num0.end()
&& i!=num0[num[i]-lap].first
&&i!=num0[num[i]-lap].second
)
return target+lap;
}
lap++;
}
}
相关文章推荐
- leetcode-java.T016_threeSumClosest---给定包含n个整数数组S,找到S中的三个整数,从而使之和最接近给定的数,返回三个整数的总和.
- 346/5000 给定一个n个整数的数组S,在S中找到三个整数,使得总和最接近给定数量的目标。 返回三个整数的和。
- LeetCode | 3Sum Closest(找到三个数使其和与target最接近)
- LeetCode 3Sum Closest 最接近目标数的三个数和
- LeetCode 16. 3Sum Closest--寻找数组中的三个元素和,该和与给定的值的差最小,输出这个和(三个元素可以不连续)
- 16. 3Sum Closest(找出和最接近给定值的三个数)
- C++之求取vector中三个元素和和给定元素最接近的值(15)---《那些奇怪的算法》
- 给定一个未排序的整数数组,找到其中位数。 中位数是排序后数组的中间值,
- 给定一个填充非负数的m×n网格,找到一条从左上到右下的路径,这个路径将所有数字的总和最小化。
- leetcode:给定一个整数数组,除了一个元素外,每个元素都会出现两次。找到那一个。
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- LeetCode试题之““给定一个正整数A,找到最小的正整数B,它的每一个数字的乘法等于A。””
- 计算一个给定数x与3和4的关系:x = 3 * n + 4 * m,并找到|n-m|的最小值
- 给定URL,如何找到它对应地缓存文件?
- 寻找和为给定数的连续正整数数列
- 数组中求俩个数,三个数,K个数和为给定sum
- Leetcode刷题记——16. 3Sum Closest(最接近的三个数的和)
- 【Codeforces Beta Round 2C】【计算几何 转化 模拟退火】Commentator problem 求一个点,使得该点到三个圆的视角范围尽可能接近
- 对给定正整数数列A进行重新排序,使得数列A满足所有的A[i]*A[i+1]都是4的倍数。
- 面试题:给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的