我只想大呼救命,啊,我用哈希表的时候一直用map,那个时候我看解析很多人用unordered_map,我还想多打这几个字母干啥,我错了
map 底层是红黑树,也就是二叉搜索树,键值是有序的 存取都是O(logn)
unordered_map 底层才是哈希表,键值是无序的,但是存取都是O(1),这个快!!!
效果还是亿点点明显
242. 有效的字母异位词
字母就26个 用 ch - ‘a’ 就能转换为下标,所以用数组进行表示也是可以的
class Solution {
public:
bool isAnagram(string s, string t) {
unordered_map<char, int>mp;
for(int i=0; i<s.size(); i++){
mp[s[i]]++;
}
for(int i=0; i<t.size(); i++){
if(mp.find(t[i]) == mp.end()) return false;
mp[t[i]]--;
if(mp[t[i]] < 0) return false;
}
for(auto x : mp){
if(x.second > 0) return false;
}
return true;
}
};
- 不能重复 ----> set
- 不需要考虑顺序—>unordered_set
这里注意构造的时候可以直接这样写更省事一点
unordered_set nums_set(nums1.begin(), nums1.end());
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int>s;
for(int i=0; i<nums1.size(); i++){
s.insert(nums1[i]);
}
vector<int>result;
for(int i=0; i<nums2.size(); i++){
if(s.find(nums2[i]) != s.end()){
result.push_back(nums2[i]);
s.erase(nums2[i]);
}
}
return result;
}
};
202. 快乐数
如果出现了之前出现的数字那么就不是快乐数
所以用set来承接一下
class Solution {
public:
bool isHappy(int n) {
unordered_set<int>s;
while(n!=1){
int x = n;
int cur = 0;
while(x){
cur += pow((x%10),2);
x= x/10;
}
if(s.find(cur) != s.end()) return false;
s.insert(cur);
n = cur;
}
return true;
}
};
//java 泛型的类型要注意
class Solution {
public boolean isHappy(int n) {
Set<Integer> s = new HashSet<>();
while(n!=1){
int x = n;
int cur = 0;
while(x>0){
cur += Math.pow((x%10),2);
x= x/10;
}
if(s.contains(cur)) return false;
s.add(cur);
n = cur;
}
return true;
}
}
1. 两数之和
只需要找出一个符合条件的元素下标
双指针或者是map
不要求顺序 用就用unordered_map 请你把这句话吸进肺里
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>m;
for(int i=0; i<nums.size(); i++){
if(m.find(target - nums[i]) !=m.end()) return {m[target-nums[i]], i};
else m[nums[i]] = i;
}
return {-1, -1};
}
};