zoukankan      html  css  js  c++  java
  • 1. Two Sum

    1,暴力搜索O(n2)

    2,使用map直接查找O(n)

    3,使用map排除两个相同值相加等于目标值的情况,并记录初始的位置,然后使用快排,最后使用二分查找

    注意:这里最快的方法是2,一定要注意数据结构的应用STL的使用,unordered_map比map的查找速度更快

    class Solution {
    public:
       vector<int> twoSum(vector<int>& nums, int target) {
            int low,high,count,place;
    		vector<int> pair;
            low = 0;
            high = nums.size()-1;
    
    		map<int,int> saveNums;
    		for(count = 0 ; count <= high ; count ++){
    		    if(saveNums.find(nums[count]) != saveNums.end() && saveNums[nums[count]] < count)
    		        if(2*nums[count] == target){
    		            pair.push_back(saveNums[nums[count]]);
    				    pair.push_back(count);
    			    	return pair;
    		        }
    		    saveNums[nums[count]] = count;
    		}
    		
         
    		highSpeed(nums,low,high);
    
            for(count = 0;count <= high;count ++){
    		     place = binSearch(nums, target - nums[count],count + 1,high);
    			
    			 if(place != -1)
    			 {
    				pair.push_back(saveNums[nums[count]]);
    				pair.push_back(saveNums[nums[place]]);
    				break;
    			 }
    		}
    		return pair; 
    		
        };
    
    	int binSearch(vector<int>& nums, int target,int start,int end){
    		int left,right,mid;
    		left = start;
    		right = end;
    
    		while(left <= right){
    			mid = (left + right)/2;
    
    			if(nums[mid] == target)
    				return mid;
    			else if(nums[mid] < target)
    				left = mid + 1;
    			else 
    				right = mid - 1;
    		}
    		return -1;
    	};
    
    	void highSpeed(vector<int>& nums,int low,int high){
    		int left,right,base,place,where;
    		left = low;
    		right = high;
    		place = low;
    		
    
    		where = 1;		
    		if(low >= high)
    			return;	
    		base = nums[left];
    
    		while(left != right){
    			if(where == 1)
    				if(nums[right] < base){
    					nums[place] = nums[right];
    					place = right;
    					left = left + 1;
    					where = 0;
    				}else{
    					right -= 1;
    				}
    			else
    				if(nums[left] > base){
    					nums[place] = nums[left];
    					place = left;
    					right = right - 1;
    					where = 1;
    				}else{
    					left += 1;
    				}
    		}
    
    		nums[place] = base;
    		
    		highSpeed(nums,low,place - 1);
    		highSpeed(nums,place + 1,high);
    	};
    };
    
  • 相关阅读:
    VS2015编译OpenSSL1.0.2源码
    VS2015编译CURL7.54.0源码
    Mac OS Yosemite 文件批量重命名
    https 原理
    把本地仓库导入到Github
    jquery cdn加速注意事项
    关于CSS 里的_width是什么意思???
    HTML的footer置于页面最底部的方法
    html-include
    GitHub Permission to <<repository>> denied to <<username>>
  • 原文地址:https://www.cnblogs.com/jackes/p/5322044.html
Copyright © 2011-2022 走看看