hash
leetcode常见的hash题目
重you小垃
这个作者很懒,什么都没留下…
展开
-
leetcode1371.每个元音包含偶数次的最长子字符串(中等)
自己没思路。。。。思路:[0…i]中的奇数字母为a e,则以i结尾的子字符串最长为:i - 奇数字母为a e的字符串第一次出现的位置。细节处理:1:用int中0…4位依次代表’a’ ‘e’… 'u’是否为奇数(1)偶数(0)2:定义长度为(1<<5)的数组,pos[i]代表状态为i(0到31)第一次出现的位置class Solution {public: int findTheLongestSubstring(string s) { vector<..原创 2022-03-22 18:44:11 · 275 阅读 · 0 评论 -
leetcode1002.查找共用字符(简单)
计数:hash是用一个数组:sums[n][26]来记录每个字符串中字符的个数,然后获得每个字符出现个数的最小值,转化成字符串,放到ans中。class Solution {public: vector<string> commonChars(vector<string>& words) { int n = words.size(); vector<vector<int>> sums(n, vecto..原创 2022-01-26 18:35:41 · 355 阅读 · 0 评论 -
leetcode128.最长连续序列(中等)
思路1:hash ——>时间复杂度O(n)定义一个flag变量,下标只能是非负数,看到nums[i]的取值范围,放弃了。。。技巧: hash 可以用unordered_map啊分析题目:不需要键->值,只要保存存在的那些值就可以了,所以可以考虑set来节省存储空间题目需要去重+hash+不需要映射 ——>unorderes_setclass Solution {public: int longestConsecutive(vector<int>&.原创 2021-10-28 19:28:32 · 111 阅读 · 0 评论 -
leetcode169.多数元素(简单)
自己的思路:hash细节:先计数。然后在hash里面找second最大的first输出优化:在遍历nums数组的时候,根据当前元素的second值进行打擂台,更新ans,这样就少去了最后再对hash进行遍历。class Solution {public: int majorityElement(vector<int>& nums) { int n = nums.size(); unordered_map<int..原创 2021-10-31 12:06:20 · 98 阅读 · 0 评论 -
leetcode1248. 统计「优美子数组」(中等)
思路一:滑动窗口窗口内始终维护k个奇数。易错点:以nums[r]结尾的子数组个数为nums[l]到下一个奇数l2之间的个数:l2 - l + 1,因此post数组要记录nums[i]下一个奇数出现的位置,当该位置是奇数时,post[i] = i,是偶数时为后面奇数的下标index。代码:index初值是什么不重要,因为访问到的post[l]一定不会取到这个值思路二:hash具体思路:用cnt[i]表示nums[i]前面有多少个奇数对于nums[i],在前面找下标j,cnt[i] - cnt[j -原创 2022-06-04 17:30:24 · 142 阅读 · 0 评论 -
leetcode1.两数之和(简单)
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { //用哈希表实现的话,只需要一重循环即可!!! //思路:如果当前元素在哈希表中不存在则加进去,若存在则结束 map<int, int> mp; vector<int> result; for (int i =.原创 2020-12-04 19:51:53 · 85 阅读 · 0 评论 -
leetcode205同构字符串(简单)
class Solution {public: bool isIsomorphic(string s, string t) { // if (s.length() != t.length()) return false; // map<char, char> mp; // for (int i = 0; i < s.length(); i++){ // for (map<char, char>:.原创 2020-11-22 19:24:01 · 128 阅读 · 0 评论 -
leetcode 242.有效的字母异位词(简单)
分析,题目只包含小写字母,所以可以通过哈希表来做,这样效率高一些class Solution {public: bool isAnagram(string s, string t) { if (s.length() != t.length()) return false; // map <char, int> mp1, mp2; // for (int i = 0; i < s.length(); i++){ /.原创 2020-11-22 19:01:37 · 102 阅读 · 0 评论 -
leetcode41. 缺失的第一个正数(困难)
自己的思路:将大于0的放到一个hash里面,然后从1开始找第一个不在hash里面的正整数,但是空间复杂度O(n),不满足题意。。空间复杂度优化:由于ans只可能是1-n+1,所以可以考虑用原数组做hash。step1:将数组中所有的负数改变为一个不可能为ans的正整数。step2:用负号标记法。i 在i-1的位置用’-'做标记,标记时注意不要标记两遍(等于没标记),在标记前判断该位置是正数才标记。step3:依次遍历每个位置,return i + 1。易错点:1:遍历到后面有的可能被标记过了,所原创 2022-01-26 13:52:16 · 205 阅读 · 0 评论 -
leetcode448.找到所有数组中消失的数字(简单)
自己的思路1:hash 空间O(n)hash,先把nums中的元素放到unordered_set中,然后从1到n遍历看哪个不在unordered_set中就放到ans中。自己的思路2:并查集 空间O(n) 不建议,代码量大且不够优具体思路: father[i]存下一个值。class Solution {public: vector<int> father; int findfather(int m); vector<int> findDisapp..原创 2021-11-12 22:31:07 · 525 阅读 · 0 评论 -
leetcode560.和为k的子数组(中等)
首先想到枚举每个区间,发现2次方的复杂度会超时,然后就不会了。。。解法:前缀和+hash[i,j]的区间和为sums[j]-sums[i-1] ==k,转化为:sums[i-1] = sums[j] - k。因此:遍历到j时,看一下前面有多少下标的sums[]值为 sums[j] - k,就是以j结尾和为k有多少个。class Solution {public: int subarraySum(vector<int>& nums, int k) { ..原创 2021-12-31 22:47:30 · 190 阅读 · 0 评论