【面试最常考算法】哈希表专题

题号标题题解标签难度
0001两数之和Python数组、哈希表简单
0041缺失的第一个正数Python数组、哈希表困难
0128最长连续序列Python并查集、数组、哈希表中等
0136只出现一次的数字Python位运算、数组简单
0242有效的字母异位词Python哈希表、字符串、排序简单
0442数组中重复的数据数组、哈希表中等
剑指 Offer 61扑克牌中的顺子Python数组、排序简单
0268丢失的数字Python位运算、数组、哈希表、数学、二分查找、排序简单
剑指 Offer 03数组中重复的数字Python数组、哈希表、排序简单

两数之和

// 通过哈希表查找数组中值为 target-nums[i]的值,即为那“两个整数”。如果不是,则存储哈希表并继续向后比对。
// 哈希表的作用:提高查询效率,存放下标值class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<Integer,Integer>();for(int i = 0 ; i < nums.length ; ++i){// 判断如果哈希表中存在 target-nums[i]的值,则返回这两个数的下标数组if(map.containsKey(target-nums[i])){return new int[]{map.get(target-nums[i]),i};// 之前存入的下标值,现在的下标值。}// 如果判断失败,则将当前值和下标存入哈希表map.put(nums[i],i);}// 如果没有找到,说明不存在,返回一个空数组(创建数组要使用new)return new int[0];}
}

缺失的第一个正数

class Solution {// 正常思路:将数组所有的数放入哈希表,随后从 1 开始依次枚举正整数,并判断其是否在哈希表中,时间复杂度为 O(N),空间复杂度为 O(N)// 原地哈希+哈希表:// 但是要满足时间复杂度为 O(n) 并且只使用常数级别额外空间,我们可以将当前数组视为哈希表。一个长度为 n 的数组,对应存储的元素值应该为 [1, n + 1] 之间,其中还包含一个缺失的元素。// 我们可以遍历一遍数组,将当前元素放到其对应位置上(比如元素值为 1 的元素放到数组第 0 个位置上、元素值为 2 的元素放到数组第 1 个位置上,等等)。
// 然后再次遍历一遍数组。遇到第一个元素值不等于下标 + 1 的元素,就是答案要求的缺失的第一个正数。
// 如果遍历完没有在数组中找到缺失的第一个正数,则缺失的第一个正数是 n + 1。
// 最后返回我们找到的缺失的第一个正数。public int firstMissingPositive(int[] nums) {int n = nums.length;// 第一步:清理数组,将无效值(负数和大于数组长度的值)替换为一个无效值(如 n + 1)for (int i = 0; i < n; i++) {if (nums[i] <= 0 || nums[i] > n) {nums[i] = n + 1; // 用比数组长度大的值替换}}// 第二步:使用索引标记值的存在情况for (int i = 0; i < n; i++) {int num = Math.abs(nums[i]);// 只处理有效的值(1 到 n)if (num <= n) {// 将对应的索引位置的值标记为负数,表示该值存在于数组中nums[num - 1] = -Math.abs(nums[num - 1]);}}// 第三步:查找第一个缺失的正整数for (int i = 0; i < n; i++) {// 如果索引位置的值是正数,则该位置对应的正整数缺失if (nums[i] > 0) {return i + 1; // 返回缺失的正整数}}// 如果所有位置的值都被标记为负数,则说明数组中包含了所有从 1 到 n 的整数// 因此缺失的正整数是 n + 1return n + 1;}
}

最长连续序列

暴力做法有两种思路。

  • 第 1 种思路是先排序再依次判断,这种做法时间复杂度最少是 O(nlog⁡2n)O(nlog2n)。
  • 第 2 种思路是枚举数组中的每个数 num,考虑以其为起点,不断尝试匹配 num + 1num + 2... 是否存在,最长匹配次数为 len(nums)。这样下来时间复杂度为 O(n2)O(n2)。

我们可以使用哈希表优化这个过程。

思路:哈希表

  1. 先将数组存储到集合中进行去重,然后使用 curr_streak 维护当前连续序列长度,使用 ans 维护最长连续序列长度。
  2. 遍历集合中的元素,对每个元素进行判断,如果该元素不是序列的开始(即 num - 1 在集合中),则跳过。
  3. 如果 num - 1 不在集合中,说明 num 是序列的开始,判断 num + 1nums + 2... 是否在哈希表中,并不断更新当前连续序列长度 curr_streak。并在遍历结束之后更新最长序列的长度。
  4. 最后输出最长序列长度。
class Solution {// public int longestConsecutive(int[] nums) {Set<Integer> numSet = new HashSet<Integer>();for(int num : nums ){numSet.add(num);}int result = 0; // 最终序列长度for(int num : numSet){// 如果集合中不存在上一个数,那么就是序列开头if(!numSet.contains(num-1)){int curr = 1;// 当前序列长度int currNum = num; // 当前数字while(numSet.contains(currNum+1)){curr+=1;currNum+=1;}result = Math.max(result , curr);}}return result;}
}

只出现一次的数字

class Solution {// 使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。// 但是使用位运算才能做到线性时间复杂度和常数空间复杂度// 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a// 任何数和其自身做异或运算,结果是 0,即 a⊕a=0// 记住:数组中的全部元素的异或运算结果即为数组中只出现一次的数字。public int singleNumber(int[] nums) {int single = 0;for (int num : nums) {single ^= num; // 相当于 single = single ^ num}return single;}
}

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

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

相关文章

STM32裸机和RTOS中的线程安全问题及STM32cubeMX中的线程安全策略

STM32线程安全问题 术语“线程” 和“多线程” 适用于裸机和基于RTOS的应用程序&#xff0c;线程安全问题并不只存在于基于RTOS的应用程序中&#xff1b;裸机应用程序中也存在这个问题&#xff0c;在裸机应用程序中&#xff0c;中断服务程序允许调用C库函数。线程安全问题可能…

C#基础:数据库中使用Linq作分组处理(反射/直接分组)

目录 一、使用反射分组 二、不使用反射分组 三、调用示例 四、代码demo 一、使用反射分组 private static List<GroupList<T>> GetGroupList<T>(List<T> entities, string groupByProperty) {// 获取分组字段的类型var propertyInfo typeof(T).…

Python实现水果忍者(开源)

一、整体介绍&#xff1a; 1.1 前言&#xff1a; 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动&#xff0c;优化并增加了一些功能。作为自己Python阶段学习的结束作品&#xff0c;文章最后有源码链接。 1.2 Python主要知识&#xff1a; &#xff08;1&#xf…

直播App遭受抓包后的DDoS与CC攻击防御策略

随着直播应用的普及&#xff0c;越来越多的用户开始依赖这些平台进行娱乐和社交活动。然而&#xff0c;这也使得直播平台成为网络攻击的目标之一。其中&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击和CC&#xff08;Challenge Collapsar&#xff0c;即HTTP慢速攻…

Python爬虫——爬取某网站的视频

爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入此网站中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要的一些…

qt-15综合实例(电子时钟)-多态重写鼠标单击和移动事件

综合实例-电子时钟 知识点digiclock.hdigiclock.cppmain.cpp运行图 知识点 setWindowOpacity(0.5);//设置窗体透明度 QTimer* Timer new QTimer(this);//新建一个定时器 connect(Timer,SIGNAL(timeout()),this,SLOT(ShowTime())); Timer->start(1000);//启动定时器 digic…

稚晖君发布5款全能人形机器人,开源创新,全能应用

8月18日&#xff0c;智元机器人举行“智元远征 商用启航” 2024年度新品发布会&#xff0c;智元联合创始人彭志辉主持并发布了“远征”与“灵犀”两大系列共五款商用人形机器人新品——远征A2、远征A2-W、远征A2-Max、灵犀X1及灵犀X1-W&#xff0c;并展示了在机器人动力、感知、…

猫头虎分享:练习提示词Prompt有什么好方法?提高Prompt水平和质量

猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体验图文、产品优点推广文稿、…

CommonJS 和 ES6 模块化

CommonJS index.js // 导入 // 方式一&#xff1a;直接导入 // const student require(./student) // const school require(./school) // console.log(student) // console.log(school)// 方式二&#xff1a;解构导入 const { name, slogan, getTel } require(./school)/…

M-Fedya and Array(cf1793)

题意&#xff1a;小于相邻元素成为局部最小值&#xff0c;大于相邻元素成为局部最大值&#xff0c;a1和an为相邻元素&#xff0c;相邻数字相差1&#xff0c;给定局部最大值的和和局部最小值的和&#xff0c;构造函数 分析&#xff1a;让第一个为x&#xff0c;每次减1&#xff…

深扒大模型微调密码 - 从入门到技术小白都能看懂的神操作

朋友们&#xff0c;你们有没有听说过"大模型"和"微调"这两个概念呢&#xff1f;别着急,我们今天就来好好聊一聊! 想象一下,你有一个非常勤奋的小助理,它会尽最大努力帮你完成各种任务。不过有时候,它的知识储备和能力肯定有限,所以你得适时给它一些专门的…

Python基础知识点--总结

1. 注释 注释用于提高代码的可读性&#xff0c;在代码中添加说明文字&#xff0c;使代码更容易理解。 单行注释&#xff1a;使用 # 符号开头&#xff0c;注释内容在符号之后的行内。多行注释&#xff1a;使用三引号&#xff08; 或 """&#xff09;包裹注释内…

树莓派5 笔记25:第一次启动与配置树莓派5_8G

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 今日购得了树莓派5_8G版本&#xff0c;性能是同运…

springboot航班进出港管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发航班进出港管理系统管理系统需要搭建的开发环境&#xff0c;还有航班进出港管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff…

SQL每日一练-0815

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别&#xff0c;显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表&#xff1a;Products 和…

React前端面试每日一试 8.什么是React Portals?

在React中&#xff0c;Portals 是一种技术&#xff0c;允许你将组件的子节点渲染到父组件DOM层次结构之外的DOM节点中。通常&#xff0c;React组件会按照嵌套结构渲染其子节点&#xff0c;但在某些情况下&#xff0c;我们希望将组件内容放置在DOM的其他位置&#xff0c;比如模态…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

springboot整合springmvc

1、创建springboot项目&#xff0c;勾选Spring web 当前springboot选择的是2.6.13版本&#xff0c;jdk1.8尽量选2.几的springboot 2、在pom.xml中导入相应的坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

WPF中XAML相对路径表示方法

在WPF XAML中&#xff0c;相对路径是一种非常实用的方式来引用资源文件&#xff0c;如图像、样式表和其他XAML文件。相对路径可以帮助您构建更加灵活和可移植的应用程序&#xff0c;因为它允许资源文件的位置相对于XAML文件的位置进行定位。 相对路径的表示方法 在XAML中&…

[机器学习]--KNN算法(K邻近算法)

KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…