给定一个n个整数的数组S,是否存在S中的4个数,使得a + b + c + d = target。 在数组中找出所有唯一的四元组,给出目标的总和。
2017-11-07 11:12
633 查看
本题源自LeetCode
------------------------------------------
思路1 :回溯法
超时
代码;
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> result;
if(num.size()==0)
return result;
vector<int> path;
sort(num.begin(),num.end());
backPath(result,num,path,target,0);
return result;
}
void backPath(vector<vector<int>>& result,vector<int>& num,vector<int> &path,int target,int start){
if(path.size()==4&&target==0){
result.push_back(path);
return;
}
int pre=INT_MAX;
for(int i=start;i<num.size();i++){
if(pre==num[i])
continue;
path.push_back(num[i]);
backPath(result,num,path,target-num[i],start+1);
path.pop_back();
}
}
思路2:
非递归;先计算俩个值再从剩下的数中选俩个。
代码:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> result;
if(num.size()==0)
return result;
int n=num.size();
sort(num.begin(),num.end()); //对数组排序
for(int i=0;i<n-3;i++){
for(int j=i+1;j<n;j++){
int sum=target-num[i]-num[j]; //先计算俩个值的和
int start=j+1; //再剩余的数中找到俩个值满足和等于给定值
int end=n-1;
while(start<end){
while(start<end&&num[start]+num[end]>sum)
end--;
if(start==end)
break;
if(num[start]+num[end]==sum){
vector<int> tmp={num[i],num[j],num[start],num[end]};
result.push_back(tmp);
while(start<end&&num[start]==num[start+1])
start++;
}
start++;
}
while(j<n-1&&num[j]==num[j+1]) //避免重复的值
j++;
}
while(i<n-1&&num[i]==num[i+1])
i++;
}
return result;
}
9bc8
------------------------------------------
思路1 :回溯法
超时
代码;
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> result;
if(num.size()==0)
return result;
vector<int> path;
sort(num.begin(),num.end());
backPath(result,num,path,target,0);
return result;
}
void backPath(vector<vector<int>>& result,vector<int>& num,vector<int> &path,int target,int start){
if(path.size()==4&&target==0){
result.push_back(path);
return;
}
int pre=INT_MAX;
for(int i=start;i<num.size();i++){
if(pre==num[i])
continue;
path.push_back(num[i]);
backPath(result,num,path,target-num[i],start+1);
path.pop_back();
}
}
思路2:
非递归;先计算俩个值再从剩下的数中选俩个。
代码:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int>> result;
if(num.size()==0)
return result;
int n=num.size();
sort(num.begin(),num.end()); //对数组排序
for(int i=0;i<n-3;i++){
for(int j=i+1;j<n;j++){
int sum=target-num[i]-num[j]; //先计算俩个值的和
int start=j+1; //再剩余的数中找到俩个值满足和等于给定值
int end=n-1;
while(start<end){
while(start<end&&num[start]+num[end]>sum)
end--;
if(start==end)
break;
if(num[start]+num[end]==sum){
vector<int> tmp={num[i],num[j],num[start],num[end]};
result.push_back(tmp);
while(start<end&&num[start]==num[start+1])
start++;
}
start++;
}
while(j<n-1&&num[j]==num[j+1]) //避免重复的值
j++;
}
while(i<n-1&&num[i]==num[i+1])
i++;
}
return result;
}
9bc8
相关文章推荐
- 346/5000 给定一个n个整数的数组S,在S中找到三个整数,使得总和最接近给定数量的目标。 返回三个整数的和。
- 给出一个有效的算法来确定在整数A1<A2<A3<...<AN的数组中是否存在整数i使得Ai=i
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- leetcode:java.T018_4Sum---给定一个整数数组,找出a + b + c + d = target的唯一解,不能有重复元素组
- 程序员面试金典——解题总结: 9.17中等难题 17.8给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target(容易)
- 给定一个集合和一个正整数c,判定是否存在该集合的子集,使其所有元素的和等于给定的正整数c?
- 搜狐笔试题:给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 给定候选号码(C)和目标号码(T)的集合,找出C中候选号码总和为T的所有唯一组合 C中的每个数字只能在组合中使用一次。
- 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1},
- 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
- 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。
- 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,
- indexOf() 如何判断一个元素在指定数组中是否存在? 找出指定元素出现的所有位置? indexOf()方法 是正序查找,lastIndexOf()是倒叙查找
- 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- 给定一组候选号码(C)(没有重复)和一个目标号码(T),找出C中所有候选号码和T相加的唯一组合。