LeetCode刷题笔记——1. 两数之和(哈希表、unordered_map)

题目

LeetCode刷题笔记——1. 两数之和(哈希表、unordered_map)_第1张图片

1. 哈希表

2. unordered_map详细介绍

  • unordered_map map;
    eg:
unordered_map<int, int> map
unordered_map<string, int> map
  • map.size()
    返回unordered_map的大小

  • map.find()
    查找key所在的元素
    找到:返回元素的迭代器。通过迭代器的second属性获取值
    没找到:返回unordered_map::end

  • map.at() 等同于 map[]
    查找key所对应的值
    如果存在:返回key对应的值,可以直接修改,和[]操作一样
    如果不存在:抛出 out_of_range 异常

  • map.begin()
    begin() : 返回开始的迭代器(和你的输入顺序没关系,因为它的无序的)
    begin(int n) : 返回n号bucket的第一个迭代器

  • map.end()
    end(): 返回结束位置的迭代器
    end(int n) : 返回n号bucket的最后一个迭代器

3. C++11 新特性: unordered_map 与 map 的对比

unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。
不同的是unordered_map不会根据key的大小进行排序,

存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的.
map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。

所以使用时map的key需要定义operator<。
而unordered_map需要定义hash_value函数并且重载operator==。
但是很多系统内置的数据类型都自带这些。

结论:如果需要内部元素自动排序,使用map,不需要排序使用unordered_map

4. 解题

  1. 暴力枚举的方法:使用两重循环枚举下标i, j, 然后判断是否满足条件,适当的优化减少循环,复杂度O(n ^ 2)
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 = 0; j < i; j ++ )
            {
                if(nums[i] + nums[j] == target)
                {
                      res = vector<int> ({i, j});
                       break;
                }
            }
            if(res.size() > 0) break; 
        }
        return res; 
    }        
};
//作者:ker-7
//链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-ti-jie-bao-li-ha-xi-biao-by-ker-7/
  1. 循环nums数组:
    循环判断target - nums[i]是否在哈希表中
    若在,保存此时两个index,将nums[i] 插入哈希表中,返回下标;
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        unordered_map<int, int> hash;

        for(int i = 0; i < nums.size(); i ++ )
        {
           int another = target - nums[i];
           if(hash.count(another))
           {
               res = vector<int> ({hash[another], i});
               break;
           }
           hash[nums[i]] = i;  
        }
        return res; 
    }        
};
作者:ker-7
链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-ti-jie-bao-li-ha-xi-biao-by-ker-7/
  1. 哈希表解法2
    nums[i]作为哈希表的键值,i作为对应的value。
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {

        unordered_map<int,int> m;

        for(int i = 0; i<nums.size(); i++)
            m[nums[i]] = i;         //向unordered_map中添加元素
        
        for(int i = 0; i<nums.size(); i++)
        {
            if(m.find(target-nums[i]) != m.end() && m[target-nums[i]] != i)  //m中存在对应的键值,且键值不为i
                return {i, m[target-nums[i]]};
        }
        return {};
    }
};

你可能感兴趣的:(leetcode,C++,c++,数据结构,leetcode,算法,hashmap)