day 6哈希表

文章讨论了在编程中使用哈希表(unordered_map)与二叉搜索树(map)的区别,强调了unordered_map在存取速度上的优势。通过示例代码展示了在字母异位词检查、找两个数组的交集、快乐数判断以及两数之和问题中,unordered_map如何提高效率。同时提到了Java中的HashSet在处理类型时的注意事项。
摘要由CSDN通过智能技术生成

我只想大呼救命,啊,我用哈希表的时候一直用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;
    }
};

349. 两个数组的交集

  1. 不能重复 ----> set
  2. 不需要考虑顺序—>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};
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值