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};
    }
};
posted @ 2025-03-25 17:46  Cheauncey  阅读(31)  评论(0)    收藏  举报