【LeetCode Cookbook(C++ 描述)】一刷哈希表(Hash Table)(下)

news2024/11/16 20:36:58

目录

  • LeetCode #349:Intersection of Two Arrays 两个数组的交集
  • LeetCode #383:Ransom Note 赎金信
  • LeetCode #454:4Sum II - 四数相加 II

本系列文章仅是 GitHub 大神 @halfrost 的刷题笔记 《LeetCode Cookbook》的提纲以及示例、题集的 C++转化。原书请自行下载学习。
本篇文章涉及新手应该优先刷的几道经典哈希表算法题,分两篇文章,以后会更新“二刷”“三刷”等等。

LeetCode #349:Intersection of Two Arrays 两个数组的交集

#349
给定两个数组,计算它们的交集。

实际上,就是查找 nums2 的元素是否在 nums1 中,只要是从一堆数中查找一个数,那么均可以考虑哈希查找,而对于未知数目与数值的情况,我们使用 unordered set 来解决。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> num_set(nums1.begin(), nums1.end());   //使用 nums1 初始化哈希集合
        vector<int> res;
        //遍历 nums2,检查元素是否在哈希集合中
        for (int num : nums2) {
            if (num_set.count(num)) {   //如果元素在哈希集合中,则添加到结果列表中
                res.push_back(num);
                num_set.erase(num);     //确保交集元素不会重复
            }
        }

        return res;
    }
};

由于使用了内置的库函数,该算法效率并不高。我们可以直接使用哈希表构建所谓的“集合”,提高代码执行效率:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int>result;
        unordered_map<int ,int>hash;

        for(const auto &num : nums1) hash[num] = 1;
        for(const auto &num : nums2) {
            --hash[num];

            if(hash[num] == 0) result.push_back(num);
        }
        return result;
    }
};

LeetCode #383:Ransom Note 赎金信

#383
给定一个赎金信( ransomNote )字符串和一个杂志( magazine )字符串。

判断 ransomNote 能不能由 magazine 里的字符串构成。可以返回 true ,否则返回 false

类似于上篇文章的 #242 有效字母异位词,找出哈希函数 f(key) = key - 'a' ,对应出每个字母在哈希表中的索引,随后以 vector 类模拟哈希表:

  • 遍历 magazine 字符串,哈希表中对应的字符增加。
  • 遍历 ransomNote 字符串,自减哈希表中对应的字符,如果在自减之后该位置的值小于 0,则说明 magazine 中没有足够的字符构建 ransomNote ,直接返回 false
  • 遍历结束,返回 true
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        if (ransomNote.size() > magazine.size()) return false;  // ransomNote 长度过长,必然不满足题意

        vector<int> cnt(26);  //初始化含有 26 个元素的哈希函数
        for (auto & c : magazine) cnt[c - 'a']++;  //遍历 magazine,每个字符加入哈希表

        for (auto & c : ransomNote) {
            cnt[c - 'a']--;
            if (cnt[c - 'a'] < 0) return false;
        }

        return true;
    }
};

LeetCode #454:4Sum II - 四数相加 II

#454

给定 4 个长度为 n 的整数数组,计算有多少个元组i , j , k , l )能满足:

nums[i] + nums[j] + nums[k] + nums[l] == 0

这道题与上篇文章提及的 4Sum 问题是基本一致的,但是我们在这里尝试使用哈希查找解决。之前我们使用哈希查找解决 3Sum 问题只是为了练习哈希表的使用,然而这一问题则体现出哈希查找的优势。

思路大致如下:

  • 初始化哈希表。
  • 分组nums1nums2 一组,nums3nums4 一组。
  • 分别对 nums1nums2 进行遍历,将所有 nums1nums2 的值之和作为哈希表的 key ,和的次数作为哈希表的 value
  • 分别对 nums3nums4 进行遍历,若 -(nums1[k] + nums4[l]) 在哈希表中,则将对应的值累加进答案。
class Solution {
public:
    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
        unordered_map<int, int> countAB;
        for (int u : A) for (int v : B) ++countAB[u + v];  //统计两个数组中的元素之和,同时统计出现的次数,放入 map

        int ans = 0;
        //统计剩余的两个元素的和,在 map 中找是否存在相加为 0 的情况,同时记录次数
        for (int u : C) for (int v : D) if (countAB.count(-u - v)) ans += countAB[-u - v];

        return ans;
    }
};

以空间换时间,该算法的时间复杂度、空间复杂度均为   O ( n 2 ) \ O(n^2)  O(n2)

呜啊?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

办公楼子母钟系统,不止显示时间,还可以做临时告示牌

在现代办公环境中&#xff0c;时间管理对于提高工作效率至关重要。传统的时钟往往只能提供最基本的时间显示功能&#xff0c;而在快节奏的办公楼里&#xff0c;一个既能准确显示时间又能发布紧急通知的系统显得尤为必要。本文将介绍办公楼子母钟系统的独特优势及其在不同场景中…

TOOL使用

一、代码生成器 1.页面代码生成&#xff08;前端&#xff09; 生成后会在前端&#xff08;pc&#xff09;代码中看得到代码&#xff0c;可在此做二次开发&#xff1a; 代码生成器中新建不同模块&#xff0c;对应着modules文件夹下文件夹—>生成代码时&#xff0c;选择对应…

50etf期权怎么可以买跌做空吗?

50ETF期权可以做买方也可以做卖方&#xff0c;并且50ETF期权还能够买涨买跌双向交易&#xff0c;50ETF期权可以看涨期权和看跌期权&#xff0c;所以50ETF期权是可以买跌做空的&#xff0c;并且50ETF期权是很适合进行做空操作的&#xff0c;下文为大家介绍50etf期权怎么可以买跌…

如何将.bin文件,hex方式查看里面数据。以自己需要的任何长度来分割

liunux环境编译命令&#xff1a; gcc test.cpp -o testtest.cpp 文件&#xff1a; instring 为需要被分割的文件&#xff1a; outstring 为分割后的文件&#xff1a; #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.…

NSF共享目录未授权访问

NSF共享目录未授权访问 Network File System(NFS)&#xff0c;是由SUN公司研制的UNIX表示层协议(pressentation layer protocol)&#xff0c;能使使用者访问网络上别处的文件就像在使用自己的计算机一样。服务器在启用nfs服务以后&#xff0c;由于fs服务未限制对外访问&#x…

同步时钟系统,防水效果出色,无惧户外雨天环境

在我们的日常生活和工作中&#xff0c;时钟是不可或缺的存在。然而&#xff0c;传统时钟在使用过程中逐渐暴露出一些问题。 传统时钟通常依靠机械结构或简单的电子元件来保持时间的准确性&#xff0c;这使得它们容易受到外界因素的干扰。例如&#xff0c;温度的变化可能导致机芯…

NAS性能巅峰的第二选择 | 极空间Z423标准版开箱体验,强大的不仅仅只是配置

NAS性能巅峰的第二选择 | 极空间Z423标准版开箱体验&#xff0c;强大的不仅仅只是配置 哈喽小伙伴们好&#xff0c;我是Stark-C~ 在去年10月份新品发布会的时候&#xff0c;极空间推出了堪称私有云性能巅峰的『极空间Z423』。作为当前民用级NAS配置的天花板&#xff0c;极空间…

安防视频监控EasyCVR视频汇聚平台设备发送了GPS位置,但是订阅轨迹为空是什么原因?

安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、GIS地图、轨迹跟踪、平台级联等视频能力。 用户描述&#xff0c;设备在电子地图中可以查看到定位信息&#xff…

简单操作,轻松创作专业级电子书

在当今数字化时代&#xff0c;电子书的崛起为创作者们带来了前所未有的便利和创作自由。相较于传统印刷书籍&#xff0c;现代电子书的制作过程不再是一项复杂而耗时的任务&#xff0c;而是通过简单操作就能轻松实现的专业级创作。 但是你知道该如何创作专业级的电子书吗&#x…

STM32的FATFS文件系统移植

准备工作 本移植基于STM32HAL库&#xff0c;在开始移植之前准备好一个Cubemx、一个待移植的FATFS源码和一张文件格式为FAT32且大小小于等于32G的SD卡。本项目用的是正点原子的F103开发板。 源码下载&#xff1a;FatFs - Generic FAT Filesystem Module 移植开始 cubemx代码 此…

图片无损压缩工具都有哪些?试试这3款巨好用的压缩软件!支持在线使用

3个图片无损压缩工具推荐&#xff0c;在线免费使用 请你一定要收藏好&#xff01; 1、转转大师 推荐指数&#xff1a;⭐⭐⭐⭐⭐ 直达链接>>pdftoword.55.la 转转大师是一个专业文档转换工具&#xff0c;支持在线编辑&#xff0c;也是微软office官方中国合作伙伴&…

07.FreeRTOS列表与列表项

文章目录 07. FreeRTOS列表与列表项1. 列表和列表项的简介2. 列表相关API函数3. 代码验证 07. FreeRTOS列表与列表项 1. 列表和列表项的简介 列表的定义&#xff1a; typedef struct xLIST {listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */volatile UBaseType_t uxN…

吴恩达机器学习-可选的实验室-正则化成本和梯度

目标 在本实验中&#xff0c;你将: 用正则化项扩展前面的线性和逻辑代价函数。重新运行前面添加正则化项的过拟合示例。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_overfit import overfit_example, output from lab_utils_common i…

关于vs2022项目占用空间太大的问题

之前在分享vs2022项目&#xff08;估计其它vs版本也差不多&#xff09;的时候发现项目占用空间比较大&#xff0c;即使压缩也不利于上传网盘&#xff0c;于是看了一下目录&#xff0c;发现有个隐藏的.vs目录&#xff0c;里面有个和项目同名的文件夹&#xff0c;占用着很大的空间…

⌈ 传知代码 ⌋ MSA+抑郁症模型总结(三)

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

NLP——Transfromer 详解

Transformer总体架构图 输入部分&#xff1a;源文本嵌入层及其位置编码器、目标文本嵌入层及其位置编码器 编码器部分 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 第二个子层连接结构包…

Liunx---批量安装服务器

目录 一、环境准备 一、环境准备 1.准备一台rhel7的主机并且打开主机图形。 2.配置好可用ip 3.做kickstart自动安装脚本后面需要用到DHCP&#xff0c;关闭VMware DHCP功能 二、安装图形化kickstart自动安装脚本的工具 yum install system-config-kickstart ----安装图形化生…

Guitar Pro简谱怎么输入 ?如何把简谱设置到六线谱的下面?

一、Guitar Pro简谱怎么输入 简谱在音乐学习、演奏、创作和传播中都起着非常重要的作用&#xff0c;是音乐领域不可或缺的工具。吉他乐谱的制作可以使简谱&#xff0c;也可以使五线谱、六线谱等多种形式&#xff0c;这几种乐谱都可以使用Guitar Pro来完成。下面来看看Guitar Pr…

springboot大学生社会实践管理信息系统-计算机毕业设计源码61970

目 录 摘要 Abstract 1 绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1技术可行性 2.1.2 经济可行性 2.1.3 社会可行性 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.…

谷歌账号被停用后,申诉没有反馈或者被拒绝后怎么办?附:谷歌账号申诉信要点和模板

有一些朋友在登录谷歌账号的时候&#xff0c;或者在是用谷歌账号的过程中突然被强制退出来&#xff0c;然后再次登录的时候就遇到了下面的提醒&#xff1a;您的账号已停用&#xff0c;而且原因通常是两大类&#xff1a;1&#xff09;谷歌账号与其他多个账号一起创建或使用的&am…