Leetcode 1.两数之和 哈希表

这是我第一次在Leetcode上写题,说实话,第一次不是太适应

 

题目链接https://leetcode-cn.com/problems/two-sum/

没想到这么个"简单题"的解法还能这么巧妙

一、暴力

复杂度O(n^2)

用时320ms,内存消耗9.4MB

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        for (int i = 0; i < nums.size(); i++)
        for (int j = i + 1; j < nums.size(); j++){
            if (nums[i] + nums[j] == target){
                res.push_back(i);
                res.push_back(j);
                return res;
            }
        }
        return res;
    }
};
View Code

 

二、哈希表

复杂度O(n)

用STL里面的map,map.count(key)为在map里面如果存在值为key的,返回true,否则,返回false

用时80ms,内存消耗10.3MB

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        unordered_map<int,int> mymap;
        for(int i=0;i<nums.size();i++)
            mymap[nums[i]]=i;
                  
        for(int i=0;i<nums.size();i++){
            int key=target-nums[i];
            
            if(mymap.count(key) && mymap[key]!=i){
                res.push_back(i);
                res.push_back(mymap[key]);
                break;
            }
        }
        return res;
    }
};
View Code

 

三、哈希表简化操作

其实还可以简化操作,可以写得更简洁一点

一边判断,一遍插入到map中

用时20ms,内存消耗10.2MB

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int, int> m;
        
        for (int i = 0; i < nums.size(); ++i) {
            if (m.count(target - nums[i])) {
                return {i, m[target - nums[i]]};
            }
            m[nums[i]] = i;
        }
        return {};
    }
};
View Code

 

posted @ 2019-03-12 16:21  looeyWei  阅读(215)  评论(0编辑  收藏  举报