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,则尾指针向前移动,英文答案已经不可能包含当前尾指针指向的数字
直到找到答案
浙公网安备 33010602011771号