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);
	};
};

 

posted @ 2016-03-26 10:02  shijiwomen  阅读(158)  评论(0编辑  收藏  举报