代码随想录刷题02.13
哈希表相关操作1
LeetCode题目1
解题思路
理解哈希表是什么,怎么运用。
哈希表(散列表)是关于数据和地址关系的数据结构,将数据的键值通过哈希函数转化为哈希表中的索引,由此,可以进行数据的快速查找等操作,适用于字符串查找等等。在题解中,遇到和查找相关时,就可以考虑是否要使用哈希表。
哈希表的底层可以通过数组和链表进行构建,通过哈希表,可以向上构建STL中的unordered_set和unordered_map这两个容器。
代码过程
class Solution {
public:
bool isAnagram(string s, string t) {
int hash[26]={0};
for(int i=0;i<s.size();i++)
{
hash[s[i]-'a']++;
}
for(int i=0;i<t.size();i++)
{
hash[t[i]-'a']--;
}
for(int i=0;i<26;i++)
{
if(hash[i]!=0)return false;
}
return true;
}
};
LeetCode题目2
解题思路
哈希表的应用主要有两步:
i)将数据存入哈希表:
在本题中,若使用set表现哈希表数据结构,直接使用容器的Insert操作即可;若使用数组来表现哈希结构,则应使用for循环首先存储数据;
ii)在哈希表中查找数据:
同样的,若使用set来表现哈希数据结构,则可以使用find操作来查找,但要注意的是,find操作返回的是迭代器地址,若查找不到,则返回set.end();
代码过程
1)用set方法表现哈希表数据结构
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int>result_set;
unordered_set<int>num_set(nums1.begin(),nums1.end());
for(auto num:nums2)//用num遍历nums容器中的数据,auto表示让编译器自动判断num的类型,本来为int
{
if(num_set.find(num)!=num_set.end())
/*unordered_set 的 find 方法可以搜索 unordered_set 中是否存在某个元素,如果存在,则返回该元素的迭代器;如果不存在,则返回 unordered_set::end().*/
result_set.insert(num);
}
return vector<int>(result_set.begin(),result_set.end());
}
};
2)用数组表现哈希表数据结构
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int hash[1002]={0};
unordered_set<int>result;
for(auto i:nums1)
{
hash[i]++;
}
for(auto j:nums2)
{
if(hash[j]!=0){
result.insert(j);
}
}
return vector<int>(result.begin(),result.end());
}
};
LeetCode题目3
解题思路
当判断一个数是否(在一个集合内)出现过时,就考虑使用哈希表数据结构。
可以表现哈希表数据结构的有:数组、unodered_set、unordered_map这三种结构。
注意:set.find(n)!=set.end()时,说明该数在集合内出现了!
代码过程
class Solution {
public:
int getsum(int n){
int sum=0;
do
{
sum+=(n%10)*(n%10);
n=n/10;
}while(n);
return sum;
}
/*void print(unordered_set<int>m){
for(auto num:m)
{
cout<<num<<endl;
}
}*/
bool isHappy(int n) {
unordered_set<int>sum_set;
print(sum_set);
while(1)
{
if(getsum(n)==1)return true;
if(sum_set.find(n)!=sum_set.end()){
// print(sum_set);
return false;
}
else{
sum_set.insert(n);
}
n=getsum(n);
}
return true;
}
};
LeetCode题目
解题思路
1)考虑什么时候使用哈希数据结构;
2)考虑使用那种数据结构来表现哈希数据结构;
3)每种数据结构的表现细节。
代码过程
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>map;
for(int i=0;i<nums.size();i++)
{
int s=target-nums[i];
if(map.find(s)!=map.end()){
return{map.find(s)->second,i};
}
else
map.insert(pair<int,int>(nums[i],i));
}
return{};
}
};