当前位置: 首页 > news >正文

哈希表-算法小结

哈希表

map set 数组

在C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示:

集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::set红黑树有序O(log n)O(log n)
std::multiset红黑树有序O(logn)O(logn)
std::unordered_set哈希表无序O(1)O(1)

std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树

红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::map红黑树key有序key不可重复key不可修改O(logn)O(logn)
std::multimap红黑树key有序key可重复key不可修改O(log n)O(log n)
std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1)

std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树

同理,std::map 和std::multimap 的key也是有序的

Set与Multiset-笔记-CSDN博客

有效的字母异位词

思路
在这里插入图片描述

定义一个数组叫做record用来上记录字符串s里字符出现的次数

242. 有效的字母异位词 - 力扣(LeetCode)

两个数组的交集

在这里插入图片描述

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int>result_set;
        unordered_set<int>nums_set(nums1.begin(),nums1.end());

        for(auto n2:nums2){
            if(nums_set.find(n2)!=nums_set.end()){
                result_set.insert(n2);
            }
        }
        return vector<int>(result_set.begin(),result_set.end());
        
    }
};

两数之和

在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
        for(int i = 0; i < nums.size(); i++) {
            // 遍历当前元素,并在map中寻找是否有匹配的key
            auto iter = map.find(target - nums[i]); 
            if(iter != map.end()) {
                return {iter->second, i};
            }
            // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};
    }
};

1. 两数之和 - 力扣(LeetCode)

四数之和

  1. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
    1. 再遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。

三数之和

双指针
依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。

如果nums[i] + nums[left] + nums[right] > 0
说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。

如果 nums[i] + nums[left] + nums[right] < 0
说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止

相关文章:

  • 01_通过调过api文字生成音频示例
  • 【C数据结构】 TAILQ双向有尾链表的详解
  • Vue2 老项目升级 Vue3 深度解析教程
  • [推荐]AI驱动的知识图谱生成器(AI Powered Knowledge Graph Generator)
  • 符号右移“ >>= “ 与 无符号右移“ >>>= “ 的区别
  • 信息安全管理与评估2024年江西省赛样题一阶段答案截图
  • 穿透三层内网VPC2
  • C++STL语法速记
  • P5738 【深基7.例4】歌唱比赛
  • 【源码】SpringMvc源码分析
  • [Dify] 基于明道云实现金融业务中的Confirmation生成功能
  • d202548
  • 库magnet使用指南
  • 少儿编程 scratch四级真题 2025年3月电子学会图形化编程等级考试Scratch四级真题解析(选择题)
  • SQLite-Web:一个轻量级的SQLite数据库管理工具
  • 智慧乡村数字化农业全产业链服务平台建设方案PPT(99页)
  • MATLAB2022b安装
  • 文件操作和 IO - 3
  • HTTP:五.WEB服务器
  • 纯虚函数(Pure Virtual Function)详解
  • 一日双赛“莎头组合”赢得强势,但国乒已开始品尝输球滋味
  • 红星控股重整期间实控人被留置后续:重整草案不会修改,涉车建兴职责已调整
  • 马上评|中药液涉嫌添加安眠药?药品安全儿戏不得
  • 武汉警方通报一起故意伤害案件:1人死亡,嫌疑人已被抓获
  • 西浦国际教育创新论坛举行,聚焦AI时代教育本质的前沿探讨
  • 江苏疾控:下设部门无“病毒研究所”,常荣山非本单位工作人员