LeetCode-3 Sum
3SumJan 18 '12 6170 / 23359
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)
沿用了3 Sum closest的代码
class Solution {
public:
void swap(vector<int> &num,int i,int j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
void bottomUp(vector<int> &num,int end){
while(end>0)
{
if(num[end]>num[end/2]){
swap(num,end,end/2);
end/=2;
}
else break;
}
}
void topDown(vector<int>&num,int end){
int index=0;
while(true){
if(index*2>end){
break;
}
else if(index*2==end){
if(num[index]<num[index*2]){
swap(num,index,index*2);
index*=2;
}
else break;
}
else{
int big=num[index];
int bigindex=index;
if(num[index*2]>big){
big=num[index*2];
bigindex=index*2;
}
if(num[index*2+1]>big){
bigindex=index*2+1;
}
if(bigindex==index)break;
else{
swap(num,index,bigindex);
index=bigindex;
}
}
}
}
void sort(vector<int>&num){
for(int i=0;i<num.size();i++){
bottomUp(num,i);
}
for(int i=num.size()-1;i>0;i--){
swap(num,0,i);
topDown(num,i-1);
}
}
int getIndexNearestSmall(vector<int>&num,int start,int end,int target){
if(start==end)return start;
int mid=(start+end)/2;
if(num[mid]>target) return getIndexNearestSmall(num,start,mid,target);
else if(num[mid]==target) return mid;
else return getIndexNearestSmall(num,mid+1,end,target);
}
int getIndexNearestSmall(vector<int>&num,int start,int target){
if(num[start]>target)return start;
if(num[num.size()-1]<target)return num.size()-1;
else return getIndexNearestSmall(num,start,num.size()-1,target);
}
vector<vector<int> > threeSum(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int>> result;
if(num.size()<3)return result;
int target=0;
sort(num);
int sum=0;
int best=0;
for(int i=0;i<num.size()-2;i++){
for(int j=i+1;j<num.size()-1;j++){
//cout<<i<<" "<<j<<endl;
int k=getIndexNearestSmall(num,j+1,target-num[i]-num[j]);
sum=num[i]+num[j]+num[k];
if(sum==target){
vector<int> ret;
ret.push_back(num[i]);
ret.push_back(num[j]);
ret.push_back(num[k]);
bool flag=true;
for(int ii=0;ii<result.size();ii++){
if(result[ii][0]==ret[0]&&result[ii][1]==ret[1]&&result[ii][2]==ret[2])
{flag=false;break;}
}
if(flag)
result.push_back(ret);
}
}
}
return result;
}
};
浙公网安备 33010602011771号