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

    直到找到答案

  • 相关阅读:
    2020CCPC秦皇岛 K 【Kindom's Power】(树上贪心dp)
    对于树上状态机dp问题的一些总结与思考
    PTA_L3题解集
    PTA_L2题解集
    树上dp_学习笔记
    2020牛客国庆集训派对day2 B【Cheap Delivers】(最短路+状压dp)
    2020牛客国庆集训派对day1
    Codeforces 1426F【Number of Subsequences】(dp)
    2019icpc陕西省赛
    CF1281E【Jeremy Bearimy】(树上点对最大值/最小值和)
  • 原文地址:https://www.cnblogs.com/bitch1319453/p/6642257.html
Copyright © 2011-2022 走看看