1.两数之和
题目:两数之和
解法1:hash表——unordered_map
unordered_map的使用:
//定义:
unordered_map<keyType,valueType> var;
//插入:(直接使用赋值语句即可)
var[key]=value;
//查找:
var.find(key);//返回值为迭代器iter,若查找失败则返回var.end()否则返回对应迭代器。
//访问:
var[key]等价于iter->second
代码:
class Solution {
public:
//返回结果是下标
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> seen;
for(int i=0;i<nums.size();i++){
auto iter=seen.find(target-nums[i]);
if(iter!=seen.end())return {i,seen[target-nums[i]]};
else seen[nums[i]]=i;
}
return {0,0};
}
};
【错误解法】解法二:使用左右区间 sum=nums[left]+nums[right];再根据sum与target的大小关系调整left或right.
错因是原题要返回下标,你排序后下标信息就变了!如果只是让你用O(n)的方法求两之和为target的二元组,则该方法适用。(例如15.三数之和)
class Solution {
public:
//返回结果是下标
vector<int> twoSum(vector<int>& nums, int target) {
//错误之处:
sort(nums.begin(),nums.end());
int left=0,right=nums.size()-1;
while(left<right){
while(nums[left]+nums[right]>target)right--;
while(nums[left]+nums[right]<target)left++;
if(nums[left]+nums[right]==target)return {left,right};
}
return {0,0};
}
};

浙公网安备 33010602011771号