笔记:散列表/哈希表
地址计算
直接定址
Hash(key) = a*key +b;
不连续,关键字映射到存储单元
Hash(key)= key+1 0->-1 3->2 5->4;
除留取余 常用
Hash(key)=key%p;
选择P,减少冲突,选取P需要取一个不大于散列表长度但接近长度的质数
数字分析
有一个关键字集合
平方取中
适用于关键字每位取值不均匀或小于散列地址所需要的位数。
折叠法
5211252-->512+125+2=648
冲突处理
开放地址
Hi=(H(key)+di)%m,i=0,1,2...,k(k<=m-1); d增量
增量序列
线性探测
平方检测
- 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
class Solution {
public:
int firstUniqChar(string s) {
unordered_map<int, int> frequency;
for (char ch: s) {
++frequency[ch];
}
for (int i = 0; i < s.size(); ++i) {
if (frequency[s[i]] == 1) {
return i;
}
}
return -1;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/first-unique-character-in-a-string/solution/zi-fu-chuan-zhong-de-di-yi-ge-wei-yi-zi-x9rok/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
做题的时候遇到简单题目不用unordered_map,unordered_set,用数组模拟哈希表也是ok的.
例如242. 有效的字母异位词
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for(int i =0;i<s.size();i++){
record[s[i]-'a'] +=1;
}
for(int i=0;i<t.size();i++){
record[t[i]-'a'] -=1;
}
for (int i = 0; i < 26; i++) {
if (record[i] != 0) {
// record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
return false;
}
}
return true;
}
};

浙公网安备 33010602011771号