[英雄星球六月集训LeetCode解题日报] 第七日 哈希表
[英雄星球六月集训LeetCode解题日报] 第七日 哈希表
- 一、 442. 数组中重复的数据
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 二、 2068. 检查两个字符串是否几乎相等
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 三、 2283. 判断一个数的数字计数是否等于数位的值
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 四、884. 两句话中的不常见单词
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 五、附每日一题 875. 爱吃香蕉的珂珂
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
一、 442. 数组中重复的数据
链接: 442. 数组中重复的数据
1. 题目描述
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
2. 思路分析
其实哈希计数很简单,但是题目要求空间复杂度O(1)。
因此可以原地哈希,把每个数放到对应的位置:
每次操作把本位置的数换出去,如果换进来的数不对,继续换出去。
这样每次都能至少让一个数在正确位置。
3. 代码实现
class Solution:def findDuplicates(self, nums: List[int]) -> List[int]:n = len(nums)for i in range(n): while nums[i] != nums[nums[i] - 1] :nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]return [nums[i] for i in range(n) if nums[i]-1 != i]
二、 2068. 检查两个字符串是否几乎相等
链接: 2068. 检查两个字符串是否几乎相等
1. 题目描述
如果两个字符串 word1 和 word2 中从 ‘a’ 到 ‘z’ 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。
给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,请你返回 true ,否则返回 false 。
一个字母 x 的出现 频率 指的是它在字符串中出现的次数。
2. 思路分析
计数比较就行。
3. 代码实现
class Solution:def checkAlmostEquivalent(self, word1: str, word2: str) -> bool:c1,c2 = Counter(word1),Counter(word2)for c,v in c1.items():if abs(v-c2.get(c,0)) >3:return Falsefor c,v in c2.items():if abs(v-c1.get(c,0)) >3:return Falsereturn True
三、 2283. 判断一个数的数字计数是否等于数位的值
链接: 2283. 判断一个数的数字计数是否等于数位的值
1. 题目描述
给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。
如果对于 每个 0 <= i < n 的下标 i ,都满足数位 i 在 num 中出现了 num[i]次,那么请你返回 true ,否则返回 false 。
2. 思路分析
这题主要是类型转换要注意。
3. 代码实现
class Solution:def digitCount(self, num: str) -> bool:cnt = Counter(num)# 注意类型转换return all(int(num[i]) == cnt.get(str(i), 0) for i in range(len(num)))
四、884. 两句话中的不常见单词
链接: 884. 两句话中的不常见单词
1. 题目描述
句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。
如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。
给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。
2. 思路分析
直接在两个一起计数,找频次1的。
3. 代码实现
class Solution:def uncommonFromSentences(self, s1: str, s2: str) -> List[str]:return [x for x,v in Counter(s1.split(' ') + s2.split(' ')).items() if v == 1]
五、附每日一题 875. 爱吃香蕉的珂珂
链接: 875. 爱吃香蕉的珂珂
1. 题目描述
珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。
珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。
2. 思路分析
速度快了就会时间短,速度慢了就时间长,要求时间不能超过h。因此可以二分。
二分上下界:[1,max(piles)]。
python的bisect参数要好好理解。
只能升序搜,key参数是指原数组每个数经过key计算后,第一个不大于 指定数据(-h)的数。
这里因为k和计算式的结果大小是相反的,所以加负号。
返回值是下标,因此range从0开始,这样可以让下标=值,但搜索下限指定为1。
3. 代码实现
# class Solution:
# def minEatingSpeed(self, piles: List[int], h: int) -> int:
# a = range(1,+1)
# ans = max(piles)+1
# l,r = 1, ans
# m = (l+r) // 2
# while l<r:
# m = (l+r) // 2
# s = sum([ceil(x/m) for x in piles])
# # print(l,r,m,s,h)
# # if s == h:
# # return m
# if s > h:
# l = m+1
# elif s <= h:
# ans = min(ans,m)
# r = m # return ansclass Solution:def minEatingSpeed(self, piles: List[int], h: int) -> int:return bisect_left(range(0,max(piles)+1), -h, lo=1, key=lambda k: -sum([ceil(x/k) for x in piles]))
[英雄星球六月集训LeetCode解题日报] 第七日 哈希表相关推荐
- [英雄星球六月集训LeetCode解题日报] 第五日 双指针
[英雄星球六月集训LeetCode解题日报] 第五日 双指针 一. 2000. 反转单词前缀 1. 题目描述 2. 思路分析 3. 代码实现 二. 917. 仅仅反转字母 1. 题目描述 2. 思路分 ...
- 【英雄算法六月集训】总结
[英雄算法六月集训]总结 一 前言 英雄哥一个认真又搞笑的人,做的视频也特别有趣,每天早上起床看他直播,一整天的好精神.原先我个人生物钟是6点半,为了听他的直播调整到了5点.早起学习,确实效率比晚上下 ...
- leetcode - 141. 环形链表(哈希表)
给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...
- LeetCode 136. Single Number【哈希表/位运算/数学】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12.由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止:由于LeetCode还在不断地创建新 ...
- [leetcode]1.两数之和 + 哈希表:梦开始的地方,英语的abandon
方案一:暴力题解没什么可说的,当然不是面试官想看到的 复杂度分析 时间复杂度:O(N^2),其中 N是数组中的元素数量.最坏情况下数组中任意两个数都要被匹配一次.空间复杂度:O(1). 方案二:直白来 ...
- LeetCode 202. 快乐数【哈希表】
202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数. 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和. 然后重复这个过程直到这个数变为 1,也可能是 无限 ...
- LeetCode 890. 查找和替换模式(哈希表)
1. 题目 你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配. 如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们 ...
- 六月集训(第17天) —— 广度优先搜索
前言 此为<英雄算法联盟:算法集训>的内容,具体内容详见:知识星球:英雄算法联盟 - 六月集训.加入星球后,即可享用星主 CSDN付费专栏 免费阅读 的权益. 欢迎大家积极 ...
- 六月集训(第21天) —— 堆(优先队列)
前言 此为<英雄算法联盟:算法集训>的内容,具体内容详见:知识星球:英雄算法联盟 - 六月集训.加入星球后,即可享用星主 CSDN付费专栏 免费阅读 的权益. 欢迎大家积极 ...
最新文章
- 飞桨博士会第三期来啦!中国深度学习技术俱乐部诚邀您加入
- bat 重启资源管理器
- Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】
- 建立SQL Server警告和给操作员发送email通知
- bzoj 1996: [Hnoi2010]chorus 合唱队
- html5移动端制作知识点总结
- 设计一款知识性产品需要考虑十二个基本问题
- java学习笔记(5)
- 太阳能光伏发电行业将重入佳境
- SuperMap 办公自动化服务平台
- 代码审查工具Sonar下载、安装、使用
- 程序员教程第五版笔记
- 北斗一号卫星授时技术及在电力系统中的应用
- 简单的CSS3动画案例——奔跑的熊哥
- ETR获取转速及PID调节原则
- keypair java_Java KeyPairGenerator genKeyPair()用法及代码示例
- LaTex(Texshop)的入门(一)(此篇有关中字字符的编译,格式的初步编排)
- gearman的安装
- 百厨盛达厨房设备中心:乐信万能蒸烤箱适合做什么菜
- 远程桌面鼠标键盘映射问题