| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 做题记录——哈希表 -> 正文阅读 |
|
[数据结构与算法]做题记录——哈希表 |
1.lc1282:用户分组来源:力扣(LeetCode) 题目:有?n?个人被分成数量未知的组。每个人都被标记为一个从 0 到 n - 1 的唯一ID?。 给定一个整数数组 groupSizes ,其中?groupSizes[i]?是第 i 个人所在的组的大小。例如,如果?groupSizes[1] = 3?,则第 1 个人必须位于大小为 3 的组中。 返回一个组列表,使每个人 i 都在一个大小为?groupSizes[i]?的组中。 每个人应该?恰好只?出现在?一个组?中,并且每个人必须在一个组中。如果有多个答案,返回其中?任何?一个。可以?保证?给定输入?至少有一个?有效的解。 示例 : 输入:groupSizes = [3,3,3,3,3,1,3] 思路:【官方题解】 作者:LeetCode-Solution 由于给定的输入一定存在有效的解,因此对于数组 groupSizes 中的每个元素 x,当 x 在数组中出现 y 次时,y 一定能被 x 整除,且大小为 x 的组有 y/x?个。 首先将每个人的编号按照组的大小划分,使用哈希表记录每个组的大小对应的所有人的编号。然后遍历哈希表,对于大小为 x 的组,得到对应的所有人编号列表,将列表的大小记为 y,则 y 一定能被 x?整除,将列表分成 y/x?个大小为 x 的组,并将每个组添加到答案中。遍历结束之后,即完成分组。 考虑示例 1 的分组。 1.根据数组 groupSizes 得到每个组的大小对应的所有人的编号:大小为 1 的组对应的编号列表是 [5],大小为 3 的组对应的编号列表是 [0,1,2,3,4,6]。 2.将每个组的大小对应的编号列表分成特定大小的列表。 大小为 1?的组对应的编号列表的长度是 1,因此有 1?个大小为 1?的组:[5]。 大小为 3 的组对应的编号列表的长度是 6,因此有 2 个大小为 3 的组:[0,1,2],[3,4,6]。 3.最终分组情况是 [[5],[0,1,2],[3,4,6]。 代码:
2.lc768:最多能完成排序的块Ⅱ来源:力扣(LeetCode) 题目:这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为10**8。 arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成多少块? 示例?: 输入: arr = [5,4,3,2,1] 思路:【官方题解】 作者:LeetCode-Solution 记数组 arr 长度为 n,排完序的数组为 sortedArr。首先,将原数组分为一块,肯定是可行的。原数组直接排序,和将它分为一块后再排序,得到的数组是相同的。那么,如何判断一个数组是否能分为符合题意的两块呢?如果一个数组能分为两块,那么一定能找到一个下标 k,这个下标将数组分为两个非空子数组 arr[0,…,k] 和 arr[k+1,…,n?1],使得 arr[0,…,k] 和 sortedArr[0,…,k] 的元素频次相同,arr[k+1,…,n?1] 和 sortedArr[k+1,…,n?1] 的元素频次相同。判断能否分为更多的块时同理。这个判断过程可以从左至右同时遍历 arr 和 sortedArr,并用一个哈希表 cnt 来记录两个数组元素频次之差。当遍历到某个下标时,如果 cnt 内所有键的值均为 0,则表示划分出了一个新的块,最后记录有多少下标可以使得 \textit{cnt}cnt 内所有键的值均为 0 即可。 代码:
该题的单调栈做法请看做题记录——栈_Kephenny的博客-CSDN博客? 3.lc1224:最大相等频率来源:力扣(LeetCode) 题目:给你一个正整数数组?nums,请你帮忙从该数组中找出能满足下面要求的 最长 前缀,并返回该前缀的长度: 从前缀中 恰好删除一个 元素后,剩下每个数字的出现次数都相同。 示例 : 输入:nums = [2,2,1,1,5,3,3,5] 思路:【官方题解】 作者:LeetCode-Solution 使用哈希表 count 记录数 x 出现的次数 count[x],freq 记录出现次数为 f?的数的数目为 freq[f],maxFreq 表示最大出现次数。 依次遍历数组,假设当前访问的数为 nums[i],对应地更新 count,freq 以及 maxFreq。以 nums[i] 结尾的数组前缀符合要求的充要条件为满足以下三个条件之一: ·最大出现次数 maxFreq=1:那么所有数的出现次数都是一次,随意删除一个数既可符合要求。 ·所有数的出现次数都是 maxFreq 或 maxFreq?1,并且最大出现次数的数只有一个:删除一个最大出现次数的数,那么所有数的出现次数都是 maxFreq?1。 ·除开一个数,其他所有数的出现次数都是 maxFreq,并且该数的出现次数为 1:直接删除出现次数为 1 的数,那么所有数的出现次数都是 maxFreq。 代码:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:44:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |