很明显可以排序二分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,则尾指针向前移动,英文答案已经不可能包含当前尾指针指向的数字
直到找到答案