242. 有效的字母异位词(数组的使用案例)
哈希表一共有三种:数组、集合set、映射map
哈希使适用:需要找到某一个值
public:
bool isAnagram(string s, string t) {
int hash[26]={0}; //一定要初始化,局部变量不初始化,会默认随机值,影响最后的 if(hash[i]!=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;
}
};
补充知识:
349. 两个数组的交集(set的使用案例)
思路
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums_set(nums2.begin(),nums2.end()); //此时result_set: {[0] = 2},因为set有自动去重功能
for(int num : nums1){
if(nums_set.find(num) != nums_set.end()){
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
提问:
那有同学可能问了,遇到哈希问题我直接都用set不就得了,用什么数组啊。
直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。
不要小瞧 这个耗时,在数据量大的情况,差距是很明显的
1. 两数之和(map的使用案例)
什么时候需要用哈希法?判断一个元素是否遍历过,或者一个元素是否在集合里的时候。 map何时使用?不仅要知道这个元素还要知道它的下标。
map是用来存放遍历过的元素 ,key存放的是元素,value存放的是下标。
这道题目中并不需要key有序,选择std::unordered_map 效率更高!
if(iter != map.end())是什么意思? 当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> map;
for(int i=0; i<nums.size(); i++){
auto iter = map.find(target-nums[i]);
if(iter != map.end()){
return {iter->second, i}; //返回两个数的下标,iter->second是map.value
}
map.insert(pair<int, int>(nums[i], i)); //pair<int, int>pair是C++中一种模板类型。每个pair对象可以存储两个值,这两个值可以是不同的数据类型。
}
return {};
}
};