您的位置:首页 > 其它

leetcode 3Sum 3Sum Closest 4Sum

2014-05-21 22:50 246 查看
这几个题很典型也是国外一些知名公司经常会问到的题

3Sum:

排序,避免重复,时间复杂度O(n^2)

class Solution {
public:

vector<vector<int> > threeSum(vector<int> &num) {
int len=num.size();
sort(num.begin(),num.begin()+len);
vector<vector<int> > ret;
ret.clear();
if(len<3)
return ret;

for(int i=0;i<len;i++)
{
if(i>0&&num[i]==num[i-1])
continue;
int j=i+1,k=len-1;
while(j<k)
{
if(j>i+1&&num[j]==num[j-1])
{
j++;
continue;
}
if(k<len-1&&num[k]==num[k+1])
{
k--;
continue;
}

int sum=num[i]+num[j]+num[k];
if(sum>0)
{
k--;
}
else if(sum<0)
{
j++;
}
else
{
vector<int> tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[k]);
ret.push_back(tmp);
j++;
}

}
}
return ret;
}
};


3Sum Closest :

class Solution {

public:

    int threeSumClosest(vector<int> &num, int target) {

        int len =num.size();

        int ret;

        sort(num.begin(),num.end());

        int i,j,k;

        int first=true;

        for(int i=0;i<len;i++)

        {

            j=i+1;

            k=len-1;

            while(j<k)

            {

                int sum=num[i]+num[j]+num[k];

                if(first)

                {

                    ret=sum;

                    first=false;

                }

                else

                {

                    if(abs(ret-target)>abs(sum-target))

                        ret=sum;

                }

                if(ret==target)

                    return ret;

                if(sum<target)

                    j++;

                else

                    k--;

            }

        }

        return ret;

    }

};

4Sum:在3sum的基础上再添加一维,时间复杂度变为O(n^3)

class Solution {

public:

    vector<vector<int> > fourSum(vector<int> &num, int target) {

        int len=num.size();

        vector<vector<int> > ret;

        

        sort(num.begin(),num.end());

        

        for(int i=0;i<len;i++)

        {

            if(i!=0&&num[i]==num[i-1])

                continue;

            for(int j=i+1;j<len;j++)

            {

                if(j>i+1 && num[j]==num[j-1])

                {

                    continue;

                }

                    int a=j+1;

                    int b=len-1;

                    while(a<b)

                    {

                        if(a!=j+1 && num[a]==num[a-1])

                        {

                            a++;

                            continue;

                        }

                        if(b!=len-1 && num[b]==num[b+1])

                        {

                            b--;

                            continue;

                        }

                        

                        int sum=num[i]+num[j]+num[a]+num[b];

                        if(sum==target)

                        {

                            vector<int> temp;

                            temp.push_back(num[i]);

                            temp.push_back(num[j]);

                            temp.push_back(num[a]);

                            temp.push_back(num[b]);

                            ret.push_back(temp);

                            a++;

                            b--;

                        }

                        else if(sum>target)

                        {

                            b--;

                        }

                        else

                        {

                            a++;

                        }

                    }

            }

        }

        return ret;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: