hot100刷题记录-哈希

一、两数之和

题目:https://leetcode.cn/problems/two-sum/description/?envType=study-plan-v2&envId=top-100-liked
方法1:枚举

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for id, num in enumerate(nums):for idx, num_1 in enumerate(nums[id+1:]):if num + num_1 == target:return [id, id + idx + 1]

两个指针,外部循环遍历全部列表,内部循环从原始列表的第二个数开始遍历,枚举所有可能的情况,判断是否等于目标数。

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for i in range(len(nums)):for j in range(i + 1, len(nums)):if i != j and nums[i] + nums[j] == target:return [i, j]return []

方法2:哈希表
新建一个字典,如果目标值减去当前值的差在字典里,那就说明存在这两个数之和等于目标值。如果没有,那就将当前值添加进字典。
遍历数组,对于每一个数 nums[i]nums[i]nums[i]:
先查找字典中是否存在 target−nums[i]target - nums[i]target−nums[i],存在则输出 target−nums[i]target - nums[i]target−nums[i] 对应的下标和当前数组的下标 iii。
不存在则在字典中存入 target−nums[i]target - nums[i]target−nums[i] 的下标 i。

def twoSum(self, nums: List[int], target: int) -> List[int]:numDict = dict()for i in range(len(nums)):if target-nums[i] in numDict:return numDict[target-nums[i]], inumDict[nums[i]] = ireturn [0]
  1. 首先,创建一个空字典 _dict 用来存储数组中每个元素的值和它们对应的索引。这样做的目的是为了快速查找数组中是否存在某个特定的值。
  2. 然后,使用一个循环遍历数组 nums 中的每一个元素。对于当前元素 nums[i],算法尝试找到一个数 x,使得 x + nums[i] = target。为了找到这样的数 x,我们可以将等式重写为 x = target - nums[i],然后查找 x 是否存在于之前遍历过的元素中。
  3. if target - nums[i] in _dict 这行代码就是检查 target - nums[i] 是否作为一个键(key)存在于字典 _dict 中。如果存在,这意味着我们找到了两个数 nums[i]x = target - nums[i],它们的和为 target
  4. 如果找到这样的一个数,return [_dict[target - nums[i]], i] 会返回这两个数的索引。其中 _dict[target - nums[i]] 是之前存储在字典中的与 x 相对应的索引,而 i 是当前 nums[i] 的索引。
    为什么要将减的值(即 x 对应的索引)放在前面,而将 i 放在后面呢?这是因为在遍历数组时,当前元素 nums[i] 的索引 i 总是大于或等于 x 对应的索引(因为 x 是在 nums[i] 之前出现的)。所以,当我们找到满足条件的一对数时,返回它们的索引时,x 对应的索引是较小的,而 i 是较大的,按照常规逻辑,我们习惯将较小的索引放在前面。
    这种方法的关键在于利用哈希表(即 Python 中的字典)来实现快速查找,这使得整个算法的时间复杂度降低到 O(n),其中 n 是数组 nums 的长度。

二、49. 字母异位词分组

题目链接地址
建立哈希表(字典),将相同的字母异位词有序化,作为键,变体作为值存储在列表里,最后取出字典的值放在列表里。

class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:_dict = {}for i in strs:n_i = ''.join(sorted(i)) # # 对字符串排序,作为字典的键if n_i in _dict:_dict[n_i].append(i) # 如果键已存在,添加到对应的列表中else:_dict[n_i] = [i] # 如果键不存在,创建一个新的键并初始化列表return [i for i in _dict.values()] # 返回字典中所有值的列表# return list(_dict.values())  # 返回字典中所有值的列表

三、128. 最长连续序列

地址
思路:随机选择一个数,如果该数-1的值不存在于列表中,说明该数字不是有序数列中的中间和后面,是开头;
找到开头,再往后找,也就是加1,如果存在,那就给当前序列长度加一,然后继续往后找,直到不存在为止;
可能有很多连续序列,不可能每个序列长度都存储到一个序列中,所以要找到全局最长,每次和局部最长对比,取最长,这样最后就是全局最长的了。

def longestConsecutive(nums):# 创建一个集合,用于存储数组中的所有不重复的数字num_set = set(nums)longest = 0  # 初始化最长连续序列的长度为0# 遍历数组中的每个数字for num in nums:# 检查当前数字的前一个数字是否不在集合中# 如果不在,说明当前数字可能是一个连续序列的起点if num - 1 not in num_set:current_num = num  # 当前正在检查的数字current_streak = 1  # 当前连续序列的长度# 继续向后查找当前数字之后的连续数字while current_num + 1 in num_set:current_num += 1  # 移动到下一个数字current_streak += 1  # 增加连续序列的长度# 更新最长连续序列的长度longest = max(longest, current_streak)# 返回最长连续序列的长度return longest

四、283. 移动零

地址

快慢指针,快指针每次走一步,慢指针只在某种条件成立时才走一步。慢指针指向当前应该被替换的位置
条件:快指针遇到了非0值,将其往前替换,也就是跟慢指针的值交换,使得非0往左移动,0往右移动

class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# 定义慢指针slow = 0# 快指针fast遍历列表for fast in range(len(nums)):# 当快指针位置不是0if nums[fast] != 0:# 替换,将当前快指针位置交换慢指针的值nums[fast], nums[slow] = nums[slow], nums[fast]# 交换过了,当前慢指针是非0值,所以往前走一步slow += 1return nums

循环过程:
遍历数组时,fast指针负责寻找非零元素。
当fast指针指向的元素不为0时,我们需要将其移到slow指针的位置。这是因为slow指针左侧的所有元素都已经处理过,即它们非零且保持了原有顺序。
交换nums[fast]和nums[slow]之后,我们增加slow指针的值,以指向下一个可能的替换位置。

五、11. 盛最多水的容器

地址
思路:对撞指针。一个从前往后,一个从后往前,计算两者间的面积。判断两个指针位置的高度,哪个低就把哪个指针移动。更新面积。退出条件:指针相遇。
**双指针必要条件:**要有终止条件(一般是两个指针相遇),未达到终止条件时要不断循环,在某个条件下移动这两个指针

本题本质上是 数组长度-1 * 最短高度 的最值问题,需要找到连续最优子数组和子最短高度
在这里插入图片描述

class Solution:def maxArea(self, height: List[int]) -> int:# 双指针 对撞指针pre = 0 # 前指针end = len(height) - 1 # 后指针marea = 0 # 最大面积# 当指针没遇到时,循环执行while pre < end:# 计算宽度,短板效应,选择两者间最短的y = (height[pre] if height[pre] < height[end] else height[end])# 计算长,指针位置的差x = end - pre # 长# 计算当前面积area = x * y# 更新最大面积if marea < area:marea = area# 如果左指针的值小于右边,就往右走一步if height[pre] < height[end]:pre += 1# 否则,右指针左移elif height[pre] >= height[end]:end -= 1# 从两个端点出发,考虑到所有可能的最优解,并记录过程中的最大值return marea

六、15. 三数之和

地址
最先想是直接三层遍历,但是一想就不可能是这样,太慢了。
依旧是对撞指针。
三数之和,如果把一个数固定,那就是两数之和。本题是双指针,可以用两个指针来指向另外两个数,成功实现降维。
先将数组进行排序,以保证按顺序查找时,元素值为升序,从而保证所找到的三个元素是不重复的。

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:res = []# 排序# 如果有重复元素,就可以避过a = sorted(nums)for i in range(len(a)):# 将i的情况放在大于0的情况,防止溢出# 如果遇到重复元素,就跳过,因为题目不让重复if i >0 and a[i] == a[i-1]:continue# 定义左右指针l, r = i+1, len(a)-1# 当指针未相撞时,执行循环while l < r:# 如果当前遍历的位置和左右指针的值和为1,表明找到解了,添加到答案,然后移动左右指针if a[i] + a[l] + a[r] == 0:res.append([a[i], a[l], a[r]])l += 1r -= 1# 如果说小于0,因为我们是排序了的,左边肯定比右边小,i又不能变,所以肯定是l太靠左了,加一右移elif a[i] + a[l] + a[r] < 0:l += 1# 反之就是右边太大,左移else:r -= 1# 虽然说上面是跳过了重复元素,但是也存在两个重复元素和其他的重复的都存在,导致有多个解是相同的# 将答案的每个元素排序后转为元组,因为列表不可哈希,用不了集合。集合去重unique_tuples = set(tuple(sorted(sublist)) for sublist in res)  # 去重并转换为集合nr = [list(tup) for tup in unique_tuples]  # 将元组转换回列表   return(nr)

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

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

相关文章

C++ //练习 8.4 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存于vector中。

C Primer&#xff08;第5版&#xff09; 练习 8.4 练习 8.4 编写函数&#xff0c;以读模式打开一个文件&#xff0c;将其内容读入到一个string的vector中&#xff0c;将每一行作为一个独立的元素存于vector中。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09…

多条件查询展开收起

顶部筛选条件很多时&#xff0c;就需要对赛选条件进行分组&#xff0c;每组都要有展开收起&#xff0c;根据页面自定义&#xff0c;还需要显示收起查询中有几条查询中的内容 思路&#xff1a; 封装一个组件&#xff0c;利用插槽自定义查询条件和分组 // 子组件 <script se…

智能枪弹柜管理系统-智能枪弹管理系统DW-S306

随着社会的发展和治安形势的日益严峻&#xff0c;对于枪弹的管理变得尤为重要。传统的手工记录和存放方式已经无法满足现代化、高效化、安全化的需求。因此&#xff0c;智能枪弹柜管理系统应运而 生。 在建设万兆主干、千兆终端的监控专网的基础上&#xff0c;弹药库安全技术…

MySQL数据库进阶第四篇(视图/存储过程/触发器)

文章目录 一、视图简单介绍与基础语法二、视图的检查选项三、视图的更新四、视图的作用五、存储过程的概念与特点六、存储过程的 创建&#xff0c;调用&#xff0c;查看&#xff0c;删除七、存储过程 — 系统变量八、存储过程 — 用户定义变量九、存储过程 — 局部变量十、存储…

最便宜也能最安全:Positive SSL证书

PositiveSSL证书的优势 价格实惠&#xff1a;相较于其他品牌的SSL证书&#xff0c;PositiveSSL证书的价格更为亲民。这使得小型企业和个人网站也能够轻松采用SSL加密技术&#xff0c;提高网站的安全性。安全性能可靠&#xff1a;虽然价格便宜&#xff0c;但PositiveSSL证书在安…

CMake和VsCode调试的使用

目录 CMake使用 CMake下载 创建系统文件目录 MakeList编写规范 VsCode启动调试 添加配置文件 添加断点&#xff0c;启动调试 CMake使用 CMake下载 输入指令 sudo apt install cmake 安装cmake&#xff0c;使用 cmake -version可查看cmake的版本信息 创建系统文件目…

unity导航网格无法烘培到台阶和斜坡

如图是我在b站学Unity导航网格时建的一个示例场景&#xff0c;本场景使用的为棱长1m的立方体&#xff0c;读者可以以此为参照度量其他物体大小。 可见导航网格根本无法烘焙到斜坡和台阶上&#xff0c;为解决问题我做了不少尝试&#xff0c;调整最大坡度和步高都没办法解决问题…

图像复原天花板!IR开创性新作实现最佳视觉质量,修复更智能、更逼真

图像复原&#xff08;IR&#xff09;指在已知图像退化的原因和模型的情况下&#xff0c;通过一系列的逆过程来恢复出原始图像的过程。这是一个长期的低级视觉任务&#xff0c;也是图像处理领域的一个重要课题。 随着深度学习技术的发展&#xff0c;图像复原领域不断出现新的网…

鸿蒙开发—【扩展textinput组件】

扩展鸿蒙textinput组件&#xff0c;支持快速扩展展性&#xff0c;标题文本等&#xff0c;文本内容双向绑定、文本组件快速复用。 /*** 单选文本*/ Component export default struct DiygwInput{//绑定的值Link value:string;//未选中图标State labelImg: Resource $r(app…

振动解调用的包络谱计算

1缘起 在振动分析中&#xff0c;对于一些高频频点的分析计算&#xff0c;使用包络谱技术&#xff0c;进而得到特化谱是最适宜的。我们看matlab信号分析中提供的一个实例&#xff1a; https://www.mathworks.com/help/signal/ug/compute-envelope-spectrum.html 轴承故障有4个…

GB28181视频监控平台EasyCVR如何通过配置实现级联不响应下级平台的检索消息?

AI视频智能分析/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff08;专网、内网、局域网、广域网、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷接入和传输。平台能将接入的…

海外智能充电桩系统开发: 助力您的新能源业务扬帆起航

一、市场趋势&#xff1a;海外新能源汽车市场蓬勃发展 近年来&#xff0c;全球新能源汽车市场呈现爆发式增长态势&#xff0c;各国政府纷纷出台政策鼓励新能源汽车发展&#xff0c;消费者对新能源汽车的接受度也不断提高。根据国际能源署&#xff08;IEA&#xff09;预测&…