LeetCode Day3 -- 哈希表

目录

1. 啥是哈希表?

2. 啥时候用哈希表?

2.1 存在性检查 → 集合Set

2.2 键值映射 → 字典Dict

2.3 频率统计 → Dict or Counter

3. LeetCode

3.1 集合

(1)2215 找出两数组的不同

(2)1207 独一无二的出现次数

(3)128 最长连续序列

3.2 字典

(1)49 字母异位词分组

(2)2352 相等行列对

(3)1 两数之和

 3.3 统计元素出现频率

(1)1657 确定两个字符串是否接近


1. 啥是哈希表?

(1)哈希表(Hash Table)是一种通过​​键值对​​(key-value pairs)存储数据的数据结构,核心是使用​​哈希函数​​(hash function)将键(key)映射到数组的特定位置。

(2)在Python中,哈希表通常有两种形式:set和dict。

  • set: 存储唯一元素的集合,不支持键值对。

  • dict: 存储键值对,键是唯一的。

2. 啥时候用哈希表?

  • 快速查找:如判断元素是否在集合中(O(1)时间复杂度)。

  • 去重:如获取唯一元素集合。

  • 计数:利用字典统计元素出现频率。

  • 映射关系:存储键值对,如缓存、数据库索引等。

  • 集合运算:如求交集、并集、差集等。

2.1 存在性检查 → 集合Set

(1)应用场景:

  • 判断元素是否存在

  • 去重处理

  • 唯一性验证

  • 交/并/差集运算

(2)实现模板:

def existence_check(data):# 1. 创建哈希集合seen = set()result = []# 2. 遍历数据for item in data:# 3. 检查或添加if item not in seen:      # 存在性检查result.append(item)seen.add(item)        # 记录访问# 4. 返回结果return result

2.2 键值映射 → 字典Dict

(1)应用场景:

  • 索引-值映射(如两数之和)

  • 分组统计(如字母异位词)

  • 缓存实现

  • 频率统计

(2)实现模板:

def value_mapping(data):# 1. 创建哈希字典mapping = {}# 2. 遍历数据for item in data:# 3. 检查或更新映射if item not in mapping:   # 首次出现mapping[item] = ...   # 初始化值else:mapping[item] = ...   # 更新值# 4. 返回结果return mapping

2.3 频率统计 → Dict or Counter

(1)应用场景:

  • 元素计数

  • Top K 问题

  • 频率唯一性检查

  • 字谜判断

(2)实现模板:

from collections import Counterdef frequency_analysis(data):# 方法1:手动统计freq = {}for item in data:freq[item] = freq.get(item, 0) + 1  # 安全获取更新# 方法2:Counter简化版freq = Counter(data)# 3. 处理结果(如找频率唯一)unique_counts = set()for count in freq.values():if count in unique_counts:return Falseunique_counts.add(count)return True

3. LeetCode

3.1 集合

(1)2215 找出两数组的不同

给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表;answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。

class Solution(object):def findDifference(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[List[int]]"""set1 = set(nums1)set2 = set(nums2)result1 = list(set1-set2)    ## 求差集result2 = list(set2-set1)return [result1, result2]

(2)1207 独一无二的出现次数

给你一个整数数组 arr,如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false

class Solution(object):def uniqueOccurrences(self, arr):""":type arr: List[int]:rtype: bool"""count = dict()seen = set()for num in arr:## 从字典count中获取键num对应的值。如果键num不存在,则返回默认值0count[num] = count.get(num,0) + 1  for value in count.values():if value in seen:return Falseseen.add(value)return True

(3)128 最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

从集合中的随机num出发,查看其左(lower)右(higher)最多延伸到哪里。

如果lower(num-1)存在,那么:

①num_set.remove(lower):从集合set中移除当前lower,因为如果从新的num开始查找,则说明当前的lower是和之前的num连续,不可能和新num连续

②length++:当前连续序列长度更新

③lower--:继续找,看有没有更小的连续

class Solution(object):def longestConsecutive(self, nums):""":type nums: List[int]:rtype: int"""if not nums:return 0num_set = set(nums)max_len = 0while num_set:num = num_set.pop()  # 随机取一个元素length = 1lower = num-1       ## 向更小方向扩展while lower:num_set.remove(lower)   length += 1lower -= 1higher = num+1      ## 向更大方向扩展while higher:num_set.remove(higher)length += 1higher += 1max_len = max(max_len, length)return max_len

3.2 字典

(1)49 字母异位词分组

给你一个字符串数组,请你将字母异位词(通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次)组合在一起。可以按任意顺序返回结果列表。

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]

输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

字母异位词:包含的字母及其个数完全相同 → 排序后应是完全相同的字符串

创建列表类型的字典,字典的 key 是排好序的字符串,value 是对应的原字符串组成的 

(2)2352 相等行列对

给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。

​1.预处理所有行​​:将每一行转换为可哈希对象(如元组),存储到字典中记录出现次数

2.​​处理列并匹配​​:遍历每一列,将其转换为相同格式的可哈希对象,检查是否在行字典中存在,存在则累加次数

from collections import defaultdict
class Solution(object):def equalPairs(self, grid):""":type grid: List[List[int]]:rtype: int"""n=len(grid)row_dict = defaultdict(int)for i in range(n):row_tuple = tuple(grid[i])  ## 将每一行转换为元组(可哈希对象)row_dict[row_tuple] += 1    ## 记录每个行元组出现的次数count = 0for j in range(n):## 对每一列:提取各行的第 j 个元素形成元组col_tuple = tuple(grid[i][j] for i in range(n))     if col_tuple in row_dict:           ## 检查列元组是否在行字典中count += row_dict[col_tuple]    ## 如果存在,累加该行元组的出现次数return count

(3)1 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。

两数之和 → 根据当前 num 找其和 target 的差值是否存在于数组中

返回的是下标 → 通过哈希表 {num:index}实现,让数组数值和下标一一对应

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""num_map = {}    ## 创建哈希表{num:index}for i, num in enumerate(nums):x = target - nums[i]if x in num_map:        ## 要找的数在哈希表里,直接返回对应索引return [i, num_map[x]]num_map[num] = i        ## 将当前num和其index加入哈希表

 3.3 统计元素出现频率

(1)1657 确定两个字符串是否接近

如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 :

你可以根据需要对任意一个字符串多次使用这两种操作。给你两个字符串,word1 和 word2 。如果 word1  word2 接近 ,就返回 true ;否则,返回 false 

两个字符串接近的条件:

  1. 两个字符串的长度必须相同(因为操作不会改变长度)。

  2. 两个字符串包含的字符种类必须相同(即字符集合相同)。

  3. 两个字符串的字符频率排序后必须相同(因为操作2允许我们重新分配字符,所以只要频率的集合相同,就可以通过操作2将一种字符的频率分配给另一种字符)。

from collections import Counter
class Solution(object):def closeStrings(self, word1, word2):""":type word1: str:type word2: str:rtype: bool"""if len(word1) != len(word2):return Falseif set(word1) != set(word2):return Falsecount1 = Counter(word1)    ## 使用Counter统计字符频率count2 = Counter(word2)if sorted(count1.values()) == sorted(count2.values()):return Trueelse: return False

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

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

相关文章

三子棋装置(电赛24E题)K230/STM32全开源

三子棋装置(电赛24E题)K230/STM32全开源,后续有具体代码参数讲解,帮助大家移植k230代码import time, os, sysfrom media.sensor import * from media.display import * from media.media import *from machine import UART from m…

终端安全检测与防御

1. 终端安全风险主要问题:企业网络中80%的安全事件源于终端,终端成为黑客攻击的重要目标。攻击手段:勒索病毒:直接勒索用户。横向渗透:通过受控终端攻击内部服务器。僵尸网络危害:信息窃取、钓鱼网站引导、…

Video_AVI_Packet(2)

博主声明:内容来自网络,仅供参考,仅适用于浅了解,如有错误,自行甄别,由此引起的后果概不负责 Video_AVI_Packet(2)一、Video Picture Aspect Ratio 与 Active Format Aspect Ratio1.…

八月补丁星期二:微软修复 111 个漏洞

微软将在2025 年 8 月补丁星期二修复 111 个漏洞,这一数量与近期平均水平大致相同。 与上个月的情况类似,微软知道今天发布的漏洞中只有一个已被公开披露,但声称没有证据表明存在野外利用。同样,截至发布时,唯一的补丁…

《C++进阶之继承多态》【普通类/模板类的继承 + 父类子类的转换 + 继承的作用域 + 子类的默认成员函数】

【普通类/模板类的继承 父类&子类的转换 继承的作用域 子类的默认构造函数】目录前言:------------------------一、继承的定义和使用1. 什么使继承?2. 为什么要引入继承?3. 怎么使用继承?① 父类(基类&#xf…

Ubuntu22.04安装OBS Studio

OBS官网的最新的虽然支持Ubuntu系统,但是只支持最新的24.2版本的,而我的电脑上的Ubuntu的版本是22.04,所以在网上寻求解决办法,看到了这一片博客,作为参考来实现ubuntu22.04安装OBS,这里提示一下&#xff0…

Ansible 基本使用

Ansible 清单 静态主机清单 主机清单支持多种格式,例如ini、yaml、脚本等。 本次课程使用 ini 格式。 #创建主机清单[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4​#测试连接单个服务器[lykcontroller ~ 14:08:18]$ ansibl…

网络资源模板--基于Android Studio 实现的九寨沟App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情(部分) 首页 购票页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也…

系统架构设计师备考之架构设计实践知识

1.信息系统架构设计理论与实践1.1.基本概念信息系统架构定义目前关于信息系统架构较为权威的定义有: (1)信息系统架构是系统的结构,由软件元素、元素外部可见属性和元素间关系组成。 (2)信息系统架构是软件…

【IgH EtherCAT】如何利用 RTAI 提供的实时任务和调度机制来构建一个高精度、确定性的工业控制应用

SVG图展示了系统的分层架构:RTAI实时层:包含RT_TASK、信号量和定时器EtherCAT Master层:主站、域、从站配置和PDO映射EtherCAT网络层:与实际硬件设备(EL3162模拟输入、EL2004数字输出)通信关键特点&#xf…

7款热门智能电视文件管理器横向评测

7款智能电视文件管理器横向评测 在智能电视和电视盒子日益普及的今天,一款好用的文件管理器能让您的数字生活更加便捷。本文为您评测了7款广受欢迎的TV版文件管理器,助您找到最适合自己的工具。 1. ES文件浏览器TV版 ES文件浏览器是一款广受欢迎的多功能…

Python 类元编程(导入时和运行时比较)

导入时和运行时比较 为了正确地做元编程,你必须知道 Python 解释器什么时候计算各个代码 块。Python 程序员会区分“导入时”和“运行时”,不过这两个术语没有严 格的定义,而且二者之间存在着灰色地带。在导入时,解释器会从上到 下…

[git diff] 对比检查变更 | 提交前复审 | 版本回退

git diff git diff 是 Git 版本控制系统中用于比较文件差异的核心命令,可以显示工作目录、暂存区(Index)和仓库历史之间的变化。 通过对比不同版本或状态的文件内容,帮助开发者理解代码变更。 比较工作目录与暂存区 运行以下命令查…

【数据可视化-85】海底捞门店数据分析与可视化:Python + pyecharts打造炫酷暗黑主题大屏

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

物联网之小白调试网关设备

小伙伴们,你们好呀!我是老寇!跟我一起学习调试网关设备 相信搞过物联网的朋友,对网关设备非常熟悉,本人以小白的视角,手把手教你调试网关设备! 工作中使用的是Ubuntu操作系统,因此&a…

Node.js特训专栏-实战进阶:22. Docker容器化部署

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 专栏内容规划详情 我将从Docker容器化部署的基础概念入手,介绍Node.js应用容器化的步骤,包括创建Dockerfile、构建镜像、运行…

eclipse嵌入式编译速度慢

eclipse 嵌入式 编译 速度慢 同一个项目,eclipse编译速度越来越慢,一开始几秒钟编译完,后面要10分钟。只需要将以下两个程序卸载重新安装即可。

编译Android版本可用的高版本iproute2

背景: Android自带的iproute2 太老,很多指令格式不支持 直接基于Android源码,替换源码下iproute2 代码编译新版,报错太多,于是改用Android NDK工具编译 环境: android-ndk-r25c-linux.zip 下载链接&am…

JavaScript的fetch函数的用法

基本语法fetch函数用于发起网络请求,返回一个Promise对象。基本语法如下:fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > console.error(Error:, error));GET请求发起一个简单的GET请求&…

Json和XML文件相互转化

目录 一.XML转Json文件 示例:将XML转换为JSON 依赖准备 Java代码示例 代码详细讲解 二.Json转XML文件 示例:将JSON转换为XML 依赖准备 Java代码示例 代码详细讲解 关键代码解析 将JSON转换为XML 写入文件 示例输入与输出 三.具有相同功能的…