news 2026/10/29 2:10:22

hot100 哈希题目复盘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hot100 哈希题目复盘

分别是1. 两数之和,49. 字母异位词分组,128. 最长连续序列这三道题。

两数之和这道题,说起来就像是四级词汇书里的第一个词——abandon。每次刷 Hot100,都是从它开始,翻来覆去,熟得不能再熟。

最直接的解法当然是暴力两层循环,时间复杂度 O(n²),这里就不展开了,毕竟大家都会。

真正值得说的是核心思路:遍历数组时,对当前元素num,我们其实只需要知道一件事——target - num是否已经出现过。这时候就该 HashSet 登场了,它的contains方法能帮我们以 O(1) 的时间快速判断一个数是否存在,整体复杂度直接降到 O(n)。

class Solution { public int[] twoSum(int[] nums, int target) { int n=nums.length; Set a=new HashSet(); for(int i=0;i<n;i++){ a.add(nums[i]); } for(int i=0;i<n;i++){ if(a.contains(target-nums[i])){ for(int j=0;j<n;j++){ if(nums[j]==target-nums[i]&&i!=j){ return new int[]{i,j}; } } } } return new int[0]; } }

字母异位词分组这题,刷了好几遍,这次再刷发现还是忘了一些细节,正好记下来。

第一个误区:一开始想着用二重链表来存,但仔细一想,链表本身没有 key 的概念,我们恰恰需要一个"key"来把变位词归到一组——排序后相同的字符串就是天然的 key。这时候就该想到 HashMap,所以选对数据结构真的很重要。

第二个误区:String 本身不能直接排序,得先转成 char 数组才能排。

第三个误区:char 数组转回 String 要用new String(...)。

第四个就是 HashMap 的基本用法别搞混:get是按键取值,put是新建或更新键值对。

总结一下:排序后的字符串做 key,HashMap 做分组容器,char 数组负责排序中转,三步走完这题就清晰了。

class Solution { public List<List<String>> groupAnagrams(String[] strs) { int n=strs.length; Map<String,ArrayList<String>> m=new HashMap<>(); for(String ss:strs){ char [] ch=ss.toCharArray(); Arrays.sort(ch); String newss=new String(ch); if(!m.containsKey(newss)){ m.put(newss,new ArrayList<>()); } m.get(newss).add(ss); } return new ArrayList<List<String>>(m.values()); } }

128. 最长连续序列
第一个误区:一开始想着用 HashMap,其实 Set 就够了。我们只需要判断某个数存不存在,不需要键值对映射,Set 完全能胜任。

第二个是核心:不是对每个数都往两边扩,而是先判断num - 1是否存在——如果不存在,说明num就是某段连续序列的起点,从它开始往后数就行;如果存在,说明它不是起点,直接跳过。这样只从起点往后数,每个数最多被访问一次,整体 O(n),避免重复计算。

第三个细节:数组转 Set 其实就是遍历每个数,一个个add进去,以及在遍历中,不要去遍历数组,不然你会发现超时了,需要去遍历set。

总结:Set 存数做 O(1) 查询,只从连续序列的起点往后数,数组遍历入 Set——三步理清,这题就不绕了。

class Solution { public int longestConsecutive(int[] nums) { int n=nums.length; Set<Integer> a=new HashSet<Integer>(); for(int num:nums){ a.add(num); } int maxlen=0; for(int num:a){ if(!a.contains(num-1)){ int curlen=1; int b=num; while(a.contains(b+1)){ b++; curlen++; } maxlen=Math.max(maxlen,curlen); } } return maxlen; } }


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 2:10:06

无刷电机驱动原理:从方波换向到 FOC 磁场定向控制

目录 一、从"换向"到"磁场定向" 二、无刷电机的驱动原理 结构与换向 为什么要知道转子位置 方波换向(六步换向) 三、电调的工作方式 电调(ESC)组成 输入信号类型 DShot 优势 四、FOC 磁场定向控制 核心思想 控制流程 优势 直觉类比 五、电机控制的关键…

作者头像 李华
网站建设 2026/10/29 2:10:04

OSPF外部路由引入

在R1上有一条静态的路由&#xff0c;192.168.1.0/24&#xff0c;但是R3,R3,R4,R5都还没有。如何让AS内部也有去往网络网络的信息呢&#xff1f;在R1上做路由引入在OSPF的进程下&#xff0c;去引入路由表中的静态路由。这个时候&#xff0c;这条外部路由&#xff0c;就会以类型5…

作者头像 李华
网站建设 2026/10/29 2:09:42

SpringBoot信创项目怎么验收?从数据库迁移到交付证据

SpringBoot信创项目怎么验收&#xff1f;从数据库迁移到交付证据 信创项目交付时&#xff0c;最容易出现的分歧&#xff0c;是双方说的“支持”不是一回事。开发团队已经导入数据库、启动应用&#xff1b;采购方以为所有模块、目标服务器和办公终端都已验证。 解决这个问题&…

作者头像 李华
网站建设 2026/10/29 2:09:18

小白程序员转行AI大模型:收藏这份从零到精通,抓住风口!

一位前端工程师通过学习AI大模型成功转行Agent开发&#xff0c;分享面试经验&#xff1a;目前AI岗位对技术深度要求提高&#xff0c;需关注Agent相关项目&#xff0c;多追踪行业热点技术如Hermes。AI大模型岗位对学历背景要求相对较低&#xff0c;是前端转行的良好机会&#xf…

作者头像 李华