leetcode.3Sum

很明显可以排序二分n*n*logn的做法

这里贴出来vector和stack的一些操作。关于vector的遍历也可以定义一个容器,然后用vector.begin()和vector.end()来遍历。以前打比赛的时候发现容器操作比直接类c语言访问更慢?不过从面向对象的角度考虑容器操作更加优秀。。?

class Solution {
public:
	bool bs(vector<int>& a,int left,int right,int key)
	{
		while(left<=right)
		{
			int mid=(left+right)>>1;
			if(a[mid]<key)
				left=mid+1;
			else	if(a[mid]>key)
				right=mid-1;
			else
				return true;
		}
		return false;
	}
    vector<vector<int> > threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int> >	ans;
        int idx=0;
        int len=nums.size();
        for(int i=0;i<len;i++)
		{
			if(i!=0&&nums[i]==nums[i-1])	continue;
			int sum=nums[i];
			for(int j=i+1;j<len;j++)
			{
				if(j!=i+1&&nums[j]==nums[j-1])	continue;
				sum+=nums[j];
				if(bs(nums,j+1,len-1,0-sum))
				{
					vector<int> fuck;
					fuck.push_back(nums[i]);
					fuck.push_back(nums[j]);
					fuck.push_back(0-sum);
					ans.push_back(fuck);
				}
				sum-=nums[j];
			}
		}
        return ans;
    }
};

 效率更高的方法就是先选取一个数,然后将它转化成two sum问题,整体复杂度n*n

嘛,two sum问题大概就是这样的逻辑:

对数据进行排序后,使用一个头指针与一个尾指针,定义如下规则:

如果两个指针指向的数字之和小于target,则头指针向后移动,因为答案已经不可能包含当前头指针指向的数字

如果两个指针指向的数字之和大于target,则尾指针向前移动,英文答案已经不可能包含当前尾指针指向的数字

直到找到答案

posted on 2017-03-30 21:36  此剑之势愈斩愈烈  阅读(101)  评论(0编辑  收藏  举报

导航