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