LeetCode 热题 100 | 哈希

目录

1  基础知识

1.1  定义哈希表

1.2  遍历哈希表

1.3  查找某一个键

1.4  插入键值对

1.5  获取键值对的值

1.6  搜索功能

2  三道题

2.1  1. 两数之和

2.2  49. 字母异位词分组

2.3  128. 最长连续序列


菜鸟做题第一周,语言是 C++

1  基础知识

1.1  定义哈希表
unordered_map<string, vector<string>> hashtable;
  • unordered_map 用于定义哈希表
  • 第一个参数为 key 的数据类型,这里是 string 类型
  • 第二个参数为 value 的数据类型,这里是 vector<string> 类型
1.2  遍历哈希表
for (auto str:hashtable) {// code
}
  • 这种遍历方法对其他容器也适用
  • 冒号后写遍历的对象,这里是 hashtable
  • 冒号前写被遍历到的元素,这里取名为 str
1.3  查找某一个键
auto it = hashtable.find(target);
if (it != hashtable.end()) {// code
}
  • find() 的参数是想要查找的 key
  • it 是本次查找的结果
  • 若没有找到,则 it 等于 hashtable.end()
  • hashtable.end() 是哈希表最后一个元素的后一位
1.4  插入键值对
// 方法一
hashtable[key] = value;
// 方法二
hashtable[key].push_back(value);
  • 目前看到过上述两种方法
  • key 处填写键,value 处填写值

这是看人下碟,暂时还不太懂

1.5  获取键值对的值
// 方法一
str->second
// 方法二
str.second
  • 同样看到过两种方法
  • str 是哈希表中的某一键值对
  • second 代表想要获取的是 value
1.6  搜索功能

作用:搜索某个键是否存在于哈希表内。

hashtable.count(key)
  • count 的作用是搜索而不是计数
  • key 代表想要搜索的键
  • 若存在该键,则返回值为 1

2  三道题

2.1  1. 两数之和

解题思路:

  1. 遍历数字集合 nums
  2. 查询是否有和为 target 的另一个数字

思路说明图:

  • 这里假设 target=9
  • 将暂时没找到伴儿的数字放入哈希表中

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hashmap;for (int i = 0; i < nums.size(); ++i) {auto it = hashmap.find(target - nums[i]);if (it != hashmap.end()) {return {i, it->second};}hashmap[nums[i]] = i;}return {};}
};

可能出现的问题:

虽然题设表明一定能找到一对和为 target 的数字,但力扣比较严谨,它要求 if 判断结构中的 else 情况也要进行返回(虽然用不到)。

2.2  49. 字母异位词分组

解题思路:

  1. 遍历 strs 中的每一个字符串
  2. 使用 sort 函数对这些字符串进行重新排序
  3. 排序前的字符串作为 key,排序后的字符串作为 value,插入到哈希表中
  4. 哈希表中每个键值对的 value 的集合即为最终的结果
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> result;unordered_map<string, vector<string>> hashtable;for (auto str:strs) {auto temp = str;sort(temp.begin(), temp.end());hashtable[temp].push_back(str);}for (auto str:hashtable) {result.push_back(str.second);}return result;}
};

这个涉及到哈希表的原理,即 key 相同时,如何存储不同的 value,暂时还没看

2.3  128. 最长连续序列

解题思路:

  1. 遍历 nums 寻找可能成为序列头的数字(不能存在 num - 1)
  2. 若找到可能成为序列头的数字,则顺着它找序列并计数(哈希表找 num + 1)
  3. 每计数完一条序列的长度都要和之前序列的长度进行比较(cucount 和 count)
  4. 返回最长的长度(count)

思路说明图:

思考过程:

一开始想的是找序列中最小的那个数字(我理所应当地认为它就是序列头),然后以它为开头去找序列并计数,但 nums 中可能存在不止一条连续序列,因此我们需要考虑所有可能的序列头。

class Solution {
public:int longestConsecutive(vector<int>& nums) {if (nums.size() == 0) return 0;int count = 1;unordered_map<int, int> hashmap;for (int i = 0; i < nums.size(); ++i) {hashmap[nums[i]] = i;}for (auto num:nums) {auto it = hashmap.find(num - 1);if (it == hashmap.end()) {int cucount = 1;it = hashmap.find(num + cucount);while (it != hashmap.end()) {++cucount;it = hashmap.find(num + cucount);}count = max(count, cucount);}}return count;}
};

哈希表并不是最优解,因为貌似用不到 value,但我目前只会哈希表。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/409918.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【现代密码学】笔记9-10.3-- 公钥(非对称加密)、混合加密理论《introduction to modern cryphtography》

【现代密码学】笔记9-10.3-- 公钥&#xff08;非对称加密&#xff09;、混合加密理论《introduction to modern cryphtography》 写在最前面8.1 公钥加密理论随机预言机模型&#xff08;Random Oracle Model&#xff0c;ROM&#xff09; 写在最前面 主要在 哈工大密码学课程 张…

JavaScript从入门到精通系列第三十一篇:详解JavaScript中的字符串和正则表达式相关的方法

文章目录 知识回顾 1&#xff1a;概念回顾 2&#xff1a;正则表达式字面量 一&#xff1a;字符串中正则表达式方法 1&#xff1a;split 2&#xff1a;search 3&#xff1a;match 4&#xff1a;replace 知识回顾 1&#xff1a;概念回顾 正则表达式用于定义一些字符串的…

从传统到智能:机器视觉检测赋能PCB行业数字化转型!

PCB板在现代电子设备中是一个重要的组成部分&#xff0c;它是用来集成各种电子元器件的信息载体。在电子领域中&#xff0c;PCB板有着广泛的应用&#xff0c;而它的质量直接影响到产品的性能。随着电子科技技术和电子制造业的发展&#xff0c;贴片元器件的体积 变小&#xff0c…

金融CRM系统是什么?有哪些功能和作用

今年市场经济下行&#xff0c;投资趋向于保守、人们消费降级&#xff0c;对于金融行业来说影响很大。受经济形式的影响加上行业的数字化转型升级&#xff0c;金融企业都在寻求客户管理的新策略&#xff0c;维护好忠实客户、吸引新客户投资。小编认为CRM系统是管理客户的不二之选…

表的增删改查 进阶(一)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 数据库约束 约束类型 NOT NUll 约束 UNIQUE 约束 D…

8x8离散余弦的快速精确实现使用数据流单指令多数据扩展指令集进行转换MMX 说明书

1.https://www.cs.cmu.edu/~barbic/cs-740/ap922.pdf 2.FFmpeg: libavcodec/x86/fdct.c Source File 再学FDCT快速精确实现协议改写浮点FDCT, ffmpeg的dct使用的就是这个快速精确协议。 3.http://dspace.fcu.edu.tw/bitstream/2377/30265/1/ICM%204-1.pdf 我想如把所有余弦…

在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型

在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型 0. 背景1. 安装依赖2. 开发 main.py3. 运行 main.py 0. 背景 看了一些文章之后&#xff0c;今天尝试在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型。 1. 安装依赖 pip install torch torchvision …

GO——gin中间件和路由

中间件 参考&#xff1a;https://learnku.com/articles/66234 结构 中间件是函数中间件函数被放在调用链上调用链的末尾是路由path对应的函数 执行过程 net/http包调用到gin的serverHTTP 参考&#xff1a;go/pkg/mod/github.com/gin-gonic/ginv1.7.7/gin.go:506 通过path找到…

el-table嵌套两层el-dropdown-menu导致样式错乱

问题&#xff1a; 解决方式&#xff1a; <el-table-column label"操作" fixed"right" width"132" align"center"><template slot-scope"scope"><div v-if"scope.row._index ! 合计"><el-d…

如何给新华网投稿发稿?新华网的媒体发稿方法步骤

现如今&#xff0c;互联网已经成为了人们获取信息的主要途径&#xff0c;各大媒体网站也成为了发布自己作品的首选平台。其中&#xff0c;新华网作为中国最具影响力的新闻媒体之一&#xff0c;其内容覆盖面广、触及人群众多&#xff0c;因此&#xff0c;能够在新华网上发表文章…

Angular系列教程之管道

文章目录 管道的基本概念使用内置管道创建自定义管道总结 在Angular中&#xff0c;管道&#xff08;Pipe&#xff09;是一个非常重要的概念。它们允许我们对数据进行转换、格式化和显示&#xff0c;并且可以轻松地在模板中使用。本篇文章将介绍Angular中的管道概念&#xff0c;…

从0到1:实验室设备借用小程序开发笔记

概论 实验室设备借用小程序&#xff0c;适合各大高校&#xff0c;科技园区&#xff0c;大型企业集团的实验室设备借用流程, 通过数字化的手段进一步提升相关单位设备保障水平&#xff0c;规范实验室和设备管理&#xff0c;用户通过手机小程序扫描设备的二维码&#xff0c;可以…