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

浙公网安备 33010602011771号