题解 | #两数之和#

两数之和

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

相关推荐

点赞 评论 收藏
分享
学java时间比较短不到三个月,基本的技术栈都过了一遍就是都不太深,有个小项目。是继续找实习还是沉淀准备秋招呢?找实习的话会花很多时间在八股,放弃的话又怕秋招简历太难看。有无大佬支招
今天java了吗:1.一定要找实习,实习不一定要去,但是找实习过程中的面试经验和心态经验才是最重要的 2.八股本来就是大头,甚至比项目重要 3.这个时间段也是面试比较多的阶段,可以抓住机会锻炼。面试才会发现自己的不足,感觉自己会了和能给面试官娓娓道来是两码事
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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