LeetCode哈希表
LeetCode哈希表
overlordmax
这个作者很懒,什么都没留下…
展开
-
670. 最大交换
1.题目描述 给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 示例 2 : 注意: 1.给定数字的范围是 [0, 108] 2.思路 1.把数字转化为字符串 2.用哈希表记录每个字符最后一次出现的索引i 3.遍历字符串,对于每个字符,查找该字符右边比它大的数字,为了找到最大的比该字符大的数字,从9开始倒序查找,并进行交换。 3.代码 class Solution { public: int maximumSwap(int num) {原创 2021-02-21 23:14:30 · 102 阅读 · 0 评论 -
350. 两个数组的交集 II
1.题目描述 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 示例 2: 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。 我们可以不考虑输出结果的顺序。 进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更优? 如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办? 2.思路(哈希表) 由于同一个数字在两个数组中都可能出现多次,因此需要用哈希表存储原创 2021-01-31 21:59:04 · 174 阅读 · 0 评论 -
767. 重构字符串
1.题目描述 给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。 若可行,输出任意可行的结果。若不可行,返回空字符串。 示例 1: 示例 2: 注意: S 只包含小写字母并且长度在[1, 500]区间内。 2.思路 1.如果要使得两相邻的字符不同,那么出现次数最多的那个数的数量必须满足下面条件,如下图所示,比如下面的a是出现次数最多的 2.这个时候a的数量已经达到了临界值,如果再多一个 a ,那么至少有两个 a 是相邻的。所以这里出现次数最多的那个字符数量的临界值是threshol原创 2021-01-20 16:57:30 · 77 阅读 · 0 评论 -
349. 两个数组的交集
1.题目描述 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 示例 2: 说明: 1.输出结果中的每个元素一定是唯一的。 2.我们可以不考虑输出结果的顺序。 2.方法1 分别遍历两个数组并用set保存每个数组的元素,元素较少的set记为s1,元素较多的set记为s2,遍历s1并查找当前遍历的元素是否存在于s2中,如果存在就加入结果数组。 3.代码 class Solution { public: vector<int> intersection(vector<int&原创 2021-01-12 16:05:58 · 74 阅读 · 0 评论 -
128. 最长连续序列
1.题目描述 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 2.思路(哈希表) 考虑枚举数组中的每个数 x,考虑以其为起点,不断尝试匹配x+1,x+2,⋯ 是否存在,假设最长匹配到了 x+y,那么以 x 为起点的最长连续序列即为 x, x,x+1,x+2,⋯,x+y,其长度为 y+1,不断枚举并更新答案即可。 对于匹配的过程,暴力的方法是 O(n) 遍历数组去看是否存在这个数,但其实更高效的方法是用一个哈希表存储数组中的数,这样查看一个数是否存在即原创 2020-07-05 13:28:35 · 3110 阅读 · 0 评论 -
594. 最长和谐子序列
1.题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。 示例 1: 说明: 输入的数组长度最大不超过20,000. 2.思路(哈希映射) 对于当前枚举的元素 x,它可以和 x + 1 组成和谐子序列。用哈希表保存数组每个值出现的次数,再遍历一遍整个数组,找出等于 x 和 x + 1 的出现次数,并找出x和x + 1出现次数之和的最大值,最大值就是最长和谐子序列的长度。 3.代码 class Solutio原创 2020-07-04 23:21:28 · 250 阅读 · 0 评论 -
219. 存在重复元素 II
1.题目描述 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。 示例 1: 示例 2: 示例 3: 2.思路(散列表) 遍历数组,对于每个元素做以下操作: 1.在散列表中搜索当前元素,如果找到了就返回 true。 2.在散列表中插入当前元素。 3.如果当前散列表的大小超过了 k, 删除散列表中最旧的元素。 否则返回false。 3.代码 class Solution { publi原创 2020-07-04 21:20:48 · 205 阅读 · 0 评论 -
217. 存在重复元素
1.题目描述 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。 示例 1: 示例 2: 示例 3: 2.思路(set) set具备的两个特点: 1.set中的元素都是排序好的 2.set中的元素都是唯一的,没有重复的 因此遍历数字,把每个元素insert进set,当set的大小小于数组的大小时,说明存在重复元素。 3.代码 class Solution { public:原创 2020-07-04 20:39:15 · 77 阅读 · 0 评论