哈希表
文章平均质量分 65
哈希表刷题
gyjllll
这个作者很懒,什么都没留下…
展开
-
哈希表总结篇
当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。原创 2023-12-03 16:06:04 · 775 阅读 · 0 评论 -
18. 四数之和(中等)
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。去重的方法也是一样,要注意的是确定值对应下标的数据去重方式一样,也就是刨去双指针的两个数据都是nums[i]==nums[i-1],左右指针去重还是一样的道理。原创 2023-12-03 15:25:06 · 338 阅读 · 0 评论 -
15. 三数之和(中等)
给你一个整数数组nums,判断是否存在三元组满足i!= ji!= k且j!= k,同时还满足。请你返回所有和为0且不重复的三元组。答案中不可以包含重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。[]唯一可能的三元组和不为 0。[[0,0,0]]唯一可能的三元组和为 0。原创 2023-12-03 14:18:20 · 730 阅读 · 0 评论 -
454. 四数相加 II(中等)
可以把本题变成两数相加的想法,前两个数组一起遍历,算出两个数的和,后两个数组一起遍历,算出两个数的和。这题最后是要输出相加等于0的一个次数,因此需要用unordered_map去做,key就是前两个数组中两个元素之和,value就是对应元素和出现的次数。然后去遍历后两个数组,看一下(0-后两个数组中两个元素之和)这个值在map中是否有,如果有,说明对应的键值就是等于0的次数,用count+=value即可,不断遍历,最后输出count。,请你计算有多少个元组。原创 2023-12-03 11:46:29 · 336 阅读 · 0 评论 -
1. 两数之和
在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。整数,并返回它们的数组下标。,请你在该数组中找出。原创 2023-12-03 10:55:43 · 351 阅读 · 0 评论 -
202. 快乐数
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。判断sum是否重复出现就可以使用unordered_set。编写一个算法来判断一个数。原创 2023-12-02 18:30:03 · 373 阅读 · 0 评论 -
350. 两个数组的交集 II
首先遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以及对应出现的次数,然后遍历第二个数组,对于第二个数组中的每个数字,如果在哈希表中存在这个数字,则将该数字添加到答案,并减少哈希表中该数字出现的次数。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。对于一个数字,其在交集中出现的次数等于该数字在两个数组中出现次数的最小值。为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出现的次数,然后遍历较长的数组得到交集。原创 2023-12-02 18:14:25 · 351 阅读 · 0 评论 -
349. 两个数组的交集
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。小知识点:集合存取vector元素方法 :unordered_set<int> res_set(nums1.begin(),nums1.end())直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。原创 2023-12-02 17:26:24 · 384 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词(中等)
定义两个索引指针,右指针为窗口有边界,进行不断遍历更新,在遍历s字符串时,这时需要去删减对应的count数组里的值:count[s[right] - 'a']--,内层循环同样利用while,这里条件就是right现在对应的count数组里的值小于0,则进入这个循环,这表明该元素词频不符合p的词频。3.窗口右移过程中将对应入队字符的词频--,如果该字符词频为负了(可能遇到了p中不存在,或者前面的目标字符数太多了导致超减),就需要缩小左区间,进入更多的字符以达到平衡,这里最好根据代码模拟一下窗口放缩;原创 2023-12-02 15:13:16 · 386 阅读 · 0 评论 -
49. 字母异位词分组(中等)
两个字符串互为字母异位词,当且仅当两个字符串包含的字母相同。同一组字母异位词中的字符串具备相同点,可以使用相同点作为一组字母异位词的标志,使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。遍历每个字符串,对于每个字符串,得到该字符串所在的一组字母异位词的标志,将当前字符串加入该组字母异位词的列表中。由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。原创 2023-12-01 13:34:50 · 343 阅读 · 0 评论 -
383. 赎金信
因为题目说只有小写字母,那可以采用空间换取时间的哈希策略,用一个长度为26的数组来记录magazine里字母出现的次数。构建哈希map,存取每个字符串中字符出现的次数,然后去比较其中一个哈希表中一个字符出现的次数是否小于另一个。然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。一些同学可能想,用数组干啥,都用map完事了,依然是数组在哈希法中的应用。原创 2023-12-01 12:27:21 · 360 阅读 · 0 评论 -
242. 有效的字母异位词
建立两个map分别存储每个字符串中字符出现的个数,然后再用循环,比较一下两个map中,相同元素出现的次数是否相同,如果有不相同,则为false。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。最后如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。再遍历 字符串s的时候,原创 2023-11-30 19:28:35 · 319 阅读 · 0 评论