可能是自己理解有问题,一开始认为返回的解可能有多个,但是题目给的接口又是只返回一个,就去直接看答案了。

显而易见的一个思路是,暴力,然而,这道题,暴力法超时了,代码如下↓

vector<int> twoSum(vector<int>& numbers, int target) {
    // write code here
    vector<int> ans;
    // 数组为空
    if(!numbers.size()) {
        return ans;
    }
    for(int i = 0; i < numbers.size() -1 ; i++) {
        for(int j = i + 1; j < numbers.size(); j++) {
            if(numbers[i] + numbers[j] == target) {
                ans.push_back(i + 1);
                ans.push_back(j + 1);
                return ans;
            }
        }
    }
    return ans;
}

另一个思路是hash表,直接使用map来简历映射,注意,mp.find函数有点意思,当无法在mp中找到值的时候,会直接返回mp.end(),因此著需要判断find的返回值是啥,就知道哈希表中是否存在想要的值,其他的就喊简单了

class Solution {
public:
    /**
     * 
     * @param numbers int整型vector 
     * @param target int整型 
     * @return int整型vector
     */
vector<int> twoSum(vector<int>& numbers, int target) {
    int size = numbers.size();
    vector<int> ans;
    unordered_map<int,int> mp;
    for(int i = 0; i < size; i++) {
        // find函数若返回end则说明没找到,反之则找到了
        // 下面这个if说明,返回的值不等于end,也就是找到了
        if(mp.find(target - numbers[i]) != mp.end()) {
            ans.push_back(mp[target - numbers[i]] + 1); //这个必然在前面
            ans.push_back(i + 1);//这个必然在后面
            break;
        }
        else {
            mp[numbers[i]] = i;
        }
    }
    return ans;
}
};