• 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,则尾指针向前移动,英文答案已经不可能包含当前尾指针指向的数字

    直到找到答案

  • 相关阅读:
    bzoj 2969: 矩形粉刷 概率期望+快速幂
    loj #6191. 「美团 CodeM 复赛」配对游戏 期望dp
    CF446C DZY Loves Fibonacci Numbers 线段树 + 数学
    CF696B Puzzles 概率期望
    bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp
    loj #6342. 跳一跳 期望dp
    CF316G3 Good Substrings 广义后缀自动机
    bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心
    bzoj 2131: 免费的馅饼
    CF19D Points 平衡树
  • 原文地址:https://www.cnblogs.com/bitch1319453/p/6642257.html
Copyright © 2020-2023  润新知