题解 | #两数之和#

两数之和

http://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f

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

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

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;
}
};
全部评论

相关推荐

笑死&nbsp;不是哥们离校了我真要睡街了&nbsp;加上还有几w的贷款&nbsp;不接受我准备去当三和大神
梦想是成为七海千秋:没事,hr这下就有底气了,下次遇到一个不接受的就说,你看,人家这学历都接受了,你凭什么不接受
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务