3Sum 3Sum Closest 4Sum

来源:互联网 发布:递归算法流程图 编辑:程序博客网 时间:2024/04/24 20:57

难度:3

3Sum的题意:

给出一列数,找出所有的满足条件的三个数,条件:三个数相加等于0

 3Sum Closest 的题意:

给出一列数,找出三个数使得三个数相加最接近target

4Sum:

和3sum一样,不过是4个数

解法:

都一样。。基本改几行就能过另外两个题

3Sum的解法:

按从小到大排序

假设找到的三个数a,b,c满足

a+b+c=0

a<=b<=c

从左往右枚举a,在[a+1,n]中寻找b和c使得b+c==-a

初始令b=a+1,c=n

当b+c<-a时,为增大b+c,应使得b右移

当b+c>-a时,为减小b+c,应使得c左移

当b+c=a时,记录结果

O(n^2)


3Sum

class Solution{public:    vector< vector<int> > threeSum(vector<int> &num)    {        vector< vector<int> > ans;        sort(num.begin(),num.end());        for(int i=0;i<num.size();i++)        {            if(i-1>=0&&num[i] == num[i-1])//如果num[i]等于num[i-1]则结果必定已被包含            {                continue;            }            //j,k,num[j]+num[k]=-num[i]            int j=i+1;            int k=num.size()-1;            while(j<num.size()&&k>i&&j<k)            {                if(num[j]+num[k]>-num[i])   k--;                else if(num[j]+num[k]<-num[i])  j++;                else                {                    vector<int>tmp;                    tmp.push_back(num[i]);                    tmp.push_back(num[j]);                    tmp.push_back(num[k]);                    if(ans.size()>=1&&ans[ans.size()-1][0] == num[i]&&ans[ans.size()-1][1] == num[j]&&ans[ans.size()-1][2] == num[k])                    {                        j++;                        continue;                    }                    ans.push_back(tmp);                    j++;                }            }        }        return ans;    }};
 3Sum Closest 

class Solution{public:    int threeSumClosest(vector<int> &num, int target)    {        int ans=0x3fffffff;        sort(num.begin(),num.end());        for(int i=0;i<num.size();i++)        {            if(i-1>=0&&num[i] == num[i-1])//如果num[i]等于num[i-1]则结果必定已被包含            {                continue;            }            //j,k,num[i]+num[j]+num[k]=target            int j=i+1;            int k=num.size()-1;            while(j<num.size()&&k>i&&j<k)            {                if(num[i]+num[j]+num[k]>target)                   {                    if(num[i]+num[j]+num[k]-target<abs(ans-target))                    {                        ans=num[i]+num[j]+num[k];                    }                    k--;                }                else if(num[i]+num[j]+num[k]<target)                  {                    if(target-num[i]-num[j]-num[k]<abs(ans-target))                    {                        ans=num[i]+num[j]+num[k];                    }                    j++;                }                else                {                    return target;                }            }        }        return ans;    }};

4Sum

class Solution{public:    vector<vector<int> > fourSum(vector<int> &num, int target)    {        sort(num.begin(),num.end());        vector<vector<int> > ans;        for(int i=0;i<num.size();i++)        {            if(i>=1&&num[i] == num[i-1])            {                continue;            }            for(int j=i+1;j<num.size();j++)            {                if(j-1>=i+1&&num[j] == num[j-1])                {                    continue;                }                int k=j+1;                int l=num.size()-1;                while(k<l&&k<num.size())                {                    if(num[i]+num[j]+num[k]+num[l] > target)    l--;                    else if(num[i]+num[j]+num[k]+num[l] < target)   k++;                    else                    {                        if(ans.size()>0&&ans[ans.size()-1][0] == num[i]&&ans[ans.size()-1][1] == num[j]&&ans[ans.size()-1][2] == num[k]&&ans[ans.size()-1][3] == num[l])                        {                            k++;                            continue;                        }                        vector<int>tmp;                        tmp.push_back(num[i]);                        tmp.push_back(num[j]);                        tmp.push_back(num[k]);                        tmp.push_back(num[l]);                        ans.push_back(tmp);                        k++;                    }                }            }        }        return ans;    }};