哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。哈希表通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存放记录的数组称做哈希表。
1. 快乐数
class Solution {
public:
int getNext(int n){ //对一个数进行数位分离,并且求其平方和
int sum = 0;
while(n>0){
sum += pow(n%10,2);
n /= 10;
}
return sum;
}
public:
bool isHappy(int n) {
//发生循环则意味着某次得到的结果回到了之前的值,这就是这题的规律,要找!!!要具体,而不是抽象
//若用数组存储每一次的值,则判断下一次的值是否在数组中的时间复杂度是O(n)
//因此使用哈希表???
unordered_map<int, int> map;
while(n!=1){
if(map.find(n)==map.end()){ //该数字不在,则加入哈希表中,继续计算下一个
map.insert({n,n});
n = getNext(n);
}else{ //若该数字已经在哈希表中,则说明陷入了循环,返回false
return false;
}
}
//跳出了循环则说明n=1,返回true
return true;
}
};
我们要解决的是一个具体的问题,拿到问题首先要研究这个问题的特点和规律,然后才能充分运用数据结构与算法来高效地解决它。
哈希表的键之所以能在O(1)的时间找到其值,是因为其中的哈希算法将该键直接映射到了内存地址,也就相当于是数组的索引,就不用一个一个去找了,因为存放的时候也是按照该规律放的。字典的实现原理也是这样的🤔