算法练习Day6 | Hash Table

63 阅读1分钟

题目

  • 454.四数相加II
  • 383.赎金信
  • 15.三数之和
  • 18.四数之和

454.四数相加II

  • 四个array, 所以不用考虑去重
  • 用unordered_map

关于umap[sum]初始值

  • umap[sum] 访问 sum 键对应的值,如果 sum 键不存在,std::unordered_map 会自动插入一个新元素,键为 sum,值为其默认值(即 int 类型的默认值 0)。

  • umap[sum]++ 会先获取 sum 键对应的值(如果不存在,则值为 0),然后将其值增加 1。

  • 换句话说,当 sum 这个键第一次被访问时,umap[sum] 会被初始化为 0,然后 ++ 操作会将其值增加到 1。每次 sum 被再次访问时,其对应的值都会增加 1。

383.赎金信

  • 和之前242.相似

15.三数之和

  • 使用哈希法需要去重
  • 用双指针更合适, 因为要求和为0
  • 记得不能用unordered_set, 要用set

std::set<vector<int>>:可以直接使用,因为 vector<int> 支持 < 操作符。std::vector 实现了词典顺序的比较,即按顺序逐元素比较。

std::unordered_set<vector<int>>:不能直接使用,因为 vector<int> 默认没有提供哈希函数。要使用 vector<int> 作为 unordered_set 的元素类型,需要提供哈希函数和相等比较函数。

18.四数之和

  • 同三数之和, 多一层循环