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

    直到找到答案

  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/bitch1319453/p/6642257.html
Copyright © 2020-2023  润新知