【代码随想录】算法训练营 第六天 第三章 哈希表 Part 1

news2024/12/24 8:56:54

目录

哈希表理论基础

242. 有效的字母异位词

题目

思路

代码

349. 两个数组的交集

题目

思路

代码

202. 快乐数

题目

思路

代码

1. 两数之和

题目

思路

代码

无序集合解法

map解法


哈希表理论基础

哈希表就是之前在数据结构中学过的散列表,通过哈希表可以实现快速查找,只要提供key值,就可以直接找到对应的value,这个和数组的根据下标直接得到数组元素异曲同工。

哈希表还涉及到元素存储的问题,如果不同值对应的下标相同时,避免出现这种名为哈希碰撞的bug的方法有两个,首先是将哈希表的每个表位置设置为链表的头结点,这样出现相同映射时就可以将其他值放到头结点之后。还有一个方法叫做线性探测,这种方法是要存的元素比哈希表容量小时可以使用,就是要存一个元素的时候,发现这个位置已经被占了,就可以往下寻找,有空位就可以放进去。

当我们想要用哈希表来解决问题时,一般会选择下面这三种数据结构:

  • array 数组
  • set 集合
  • map 映射

当我们需要判断一个元素是否出现在集合里时,就要立马想到哈希法,而且,使用哈希表是一种用空间换时间的方法,因此才能实现快速查找。

242. 有效的字母异位词

题目

思路

两个字符串就是两个数组,要提取出数组中所有不同的值,还要记录出现的次数,首先想到的就是哈希表,不同的字母就是不同的key,字母出现的次数就是value,这里给出的字符串中只有26个小写字母,所以工作量并不大,把26个字母映射为26个数就行。

所以,先开一个长度为26的数组,数组中的元素全部赋值为0,便于后续对每个字母的出现进行计数;

接着,先遍历第一个字符串,每遍历到一个位置都要将这个位置的字母映射为数组的一个下标,这里的映射很简单,因为26个小写字母在ASCII表中是从a开始连续排列的,所以只需要把每个字符串元素减去字符 'a' ,就可以得到它们的相对位置了,用这个相对位置来作为它们在数组中的下标即可;

遍历第一个字符串时,每遇到一个字母,就在相应的数组元素中加一;遍历第二个字符串时,每遇到一个就减一。这样到最后,如果数组中所有元素都为0,就说明两个字符串满足条件,返回true,只要有一个不为0,就直接返回false,这个用遍历就可以实现。

代码

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            record[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) {
                return false;
            }
        }
        return true;
    }
};

349. 两个数组的交集

题目

思路

这道题中涉及到的数据范围太大了,不像上面只有二十六个小写字母,如果使用数组的话会导致空间利用率太低,除此之外,我们还看到题目中说,输出结果中每个元素都是唯一的,这意味着需要我们去重,而且不用考虑结果的输出顺序;

提高空间利用率 + 去重 + 不考虑顺序,这一切都指向一个STL容器,名为 unordered_set,作为无序集合,它可以用来去重,既然需要使用这个容器,我们就需要了解它的一些简单操作:

begin()    end()转换容器时填写在括号中
insert()插入元素
find(num)集合中存在num则返回这个num的迭代器,否则返回end()的迭代器

接下来操作就很简单了,我们先把一个数组转换为集合,再遍历另一个数组,如果另一个数组中的元素出现在集合中,我们就把这个元素添加到结果集合里。

代码

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 (int num : nums2) {
            if (nums_set.find(num) != nums_set.end()) { // 找到就返回这个元素的迭代器,没找到就返回指向end的迭代器
                result_set.insert(num); // 往unordered_set里添加元素用的是num
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};

202. 快乐数

题目

思路

这道题就跟中学时做过的规律题一样,每次运算后会得到一个数,如果这个数之前出现过,就说明之后的运算会进入循环,我们可以使用集合来存储每次新出现的数,并通过不断的循环来判断有没有旧数出现,如果出现了,那就直接返回false,但是如果计算出结果为1,就返回true。

代码

class Solution {
public:
    int getsum(int n) {
        int sum = 0;
        while(n) {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> set;
        while (1) {
            int sum = getsum(n);
            if (sum == 1) {
                return true;
            }
            if (set.find(sum) != set.end()) {
                return false;
            }
            else {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

1. 两数之和

题目

思路

我是使用unorder_set来做的,用这个方法需要对两个数相等的情况进行特判,所以麻烦了一点,但好歹也是我自己做出来的,所以下面也会放上我的解法,算是正反馈;

而卡哥则是用map来做。map相当于python里的字典,我们每次可以存入一对数据,前者是key,后者是value,对应这道题里的数组元素和下标,因为我们查找过程中用到的是数组元素,但是最后返回的是下标,所以这里用map最合适不过了。

map的用法详见代码随想录,需要记得是,当题目中的查询涉及到一对相关联的数据时,最好使用map,因为数组只适用于数据较少时,集合只存元素,不存下标,这都对本题的解答不利,虽然我用set也勉强解出来了。

map解法的思路和我的无序集合解法基本一致,遍历所有元素,每遍历一个元素后就将其存入map,还要查询map里是否有与其相补的元素,如果有的话,就返回两者的下标组成的数对pair,这就避免了当两个满足条件的元素相等时所需要的特判。

代码

无序集合解法
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_set<int> set(nums.begin(), nums.end());
        vector<int> result1, result2;
        int n = 0;
        for (int i = 0; i < nums.size(); i++) {
            int num = target - nums[i];
            if (set.find(num) != set.end() && num != nums[i]) {
                result1.push_back(i);
            }
        }
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] * 2 == target) {
                result2.push_back(i);
                n++;
            }
        }
        if (n == 2)
            return result2;
        else
            return result1;
    }
};
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++) {
            auto iter = map.find(target - nums[i]);
            if (iter != map.end()) {
                return {iter->second, i};
            }
            map.insert(pair<int, int>(nums[i], i));
        }
        return {};
    }
};

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

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

相关文章

2023年中国工业气体行业研究报告

第一章 行业概况 1.1 定义 工业气体行业是一个不可或缺的产业领域&#xff0c;它为多种行业提供关键的产品和服务。工业气体&#xff0c;包括氧气、氮气、氩气、二氧化碳、氦气、氢气及特种气体等&#xff0c;是现代工业生产和科学研究的基础。这些气体在不同的领域具有广泛的…

配置PPPoE拨号双链路上行备份示例

组网图形 图1 设备作为PPPoE Client双链路上行备份组网图 组网需求配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;设备下行通过GE1/0/0连接局域网用户&#xff0c;上行通过GE2/0/0接入PPPoE Server1作为主链路&#xff0c;通过GE3/0/0接入PPPoE Server2作为备份…

网站管家机器人在为企业获客方面起什么作用?

随着科技的不断进步和人们对便捷服务的需求增加&#xff0c;网站管家机器人成为了现代企业获客的重要工具。作为一种基于人工智能技术的在线助手&#xff0c;网站管家机器人可以与访问企业网站的用户进行智能对话&#xff0c;并提供即时的帮助和解答。 网站管家机器人在为企业获…

图吧工具箱2023,供大家学习研究参考!

1.修复Thaiphoon异常关闭的问题。 2.修复<下载皮肤编辑器>无效的问题。 3.移除OCCT。 4.添加Steam官方下载页的快捷方式。 5.移除老旧的兼容模式。 下载&#xff1a;https://download.csdn.net/download/weixin_43097956/88449046

Si24R2|2.4G单发射芯片 +7dBm可调功率 校讯通

Si24R2是一种通用、低功耗、高性能的2.4GHz无线射频发射芯片&#xff0c;主要用于单向通信系统&#xff0c;以降低系统成B&#xff0c;在运行中与si24r1兼容。 Si24r2具有低功耗和低成B。 它主要用于单向低功率传输系统&#xff0c;如无线控制系统、无线数据采集系统等。 Si2…

8.对象贴地

愿你出走半生,归来仍是少年&#xff01; 在场景中&#xff0c;有时候需要对地物&#xff08;房屋、楼宇&#xff09;进行贴地处理&#xff0c;或者说相对地面高度&#xff08;井盖、井室&#xff09;进行设置。 通过自定义的Terrain切片以及影像瓦片构建的三维场景应该如何获取…

Optuna:带仪表盘的可视化的超参数优化

1、引言 Optuna是一个由日本东京大学开发的自动化超参数优化库&#xff0c;用于机器学习和人工智能。它可用于自动优化神经网络、随机森林等模型的超参数&#xff0c;以改善模型的性能和准确性。Optuna还可以与其他流行的机器学习框架&#xff08;如TensorFlow和PyTorch&#…

企业数据泄密的场景有哪些?怎样斩断员工泄密风险?

企业数据泄露事件频频发生、屡禁不止&#xff0c;根据美国威瑞森通信公司&#xff08;Verizon&#xff09;《2023 Data Breach Investigations Report》&#xff0c;由外部攻击导致的数据泄露事件中&#xff0c;95%的外部攻击是以金钱利益为驱使的。同样&#xff0c;闪捷发布的…

开发者视角下的直播实时美颜SDK:集成和自定义的方法

在今天的数字时代&#xff0c;视频直播已经成为了一种强大的社交工具和娱乐方式。为了让直播内容更吸引人&#xff0c;实时美颜技术已经成为直播应用的重要组成部分。本文将从开发者的角度探讨如何集成和自定义直播实时美颜SDK&#xff0c;以满足用户的美颜需求。 一、什么是直…

算法通关村-----归并排序

基本原理 归并排序采用分治的思想&#xff0c;即分而治之&#xff0c;分就是将一个大问题分成一些小问题求解&#xff0c;治就是将分得的小问题得到的答案和在一起&#xff0c;得到最终的结果。体现在归并排序上&#xff0c;就是将大的数组分成小的序列&#xff0c;一直分到每…

Android问题笔记 - 关于SuperNotCalledException报错异常信息的解决方案

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

解决win10远程桌面连接出现的“身份验证错误,要求的函数不支持”问题

用win10远程左面连接window服务器&#xff0c;出现上面问题。出现身份验证错误&#xff0c;要求的函数不支持。可以使用以下方法来解决&#xff1a; 1、winr键&#xff1a;输入gpedit.msc&#xff0c;然后回车 选择计算机配置>管理模板>系统>凭据分配>加密Oracle/…

四川云汇优想:短视频矩阵运营方案

短视频矩阵运营方案是为了提高短视频平台的用户黏性和活跃度&#xff0c;从而增强用户粘性和平台的商业价值而制定的。下面四川百幕晟小编将对短视频矩阵运营方案进行详细的介绍和分析。 首先&#xff0c;短视频矩阵运营方案要注重用户精细化运营。通过用户画像和兴趣标签&…

apple pencil一定要买吗?平价电容笔推荐

现在&#xff0c;电容笔在在线办公和在线教育领域非常流行&#xff0c;那么平替电容笔会不会代替原装的苹果笔呢&#xff1f;实际上&#xff0c;也不一定要买苹果的原装电容笔。一款平替式电容笔&#xff0c;售价只要一两百块钱&#xff0c;比苹果原装的那款电容笔要便宜不少&a…

众佰诚:抖音小店如何起店名好

在当今社会&#xff0c;随着互联网的发展&#xff0c;越来越多的人选择在网上开设自己的小店。抖音作为目前最受欢迎的短视频平台之一&#xff0c;也吸引了大量的商家入驻。那么&#xff0c;如何在抖音上开设一家有特色的小店呢?首先&#xff0c;我们需要为我们的小店起一个好…

LiveQing视频点播流媒体RTMP推流服务功能-如何配置资源进行轮巡播放视频轮播分屏展示

LiveQing视频点播流媒体RTMP推流服务功能-如何配置资源进行轮巡播放视频轮播分屏展示 1、分屏展示2、右击节点新建分组3、配置轮播间隔(秒&#xff09;4、选择资源5、轮巡播放6、停止分组播7、切换播放的流类型8、RTMP推流视频直播和点播流媒体服务 1、分屏展示 2、右击节点新建…

嵌入式实时操作系统的设计与开发 (第一级内存管理算法)

伙伴算法及实现上的改进 可变内存管理&#xff0c;随着内存的不断分配和回收&#xff0c;即使系统中有1MB的内存&#xff0c;也可能因没法分配大小为100KB的连续内存块而造成分配失败。 伙伴系统&#xff0c;可以大大改善这一情况。 伙伴系统的缺点&#xff1a; 仅管大小为2…

中了devos勒索病毒后如何正确解决,勒索病毒解密,数据恢复

对于企业来说&#xff0c;企业的计算机网络安全防护非常有必要&#xff0c;不然很容易被黑客攻击&#xff0c;最近一段时间我们接到客户求助&#xff0c;企业的服务器被Devos勒索病毒攻击&#xff0c;导致企业的计算机无法正常使用。经过云天数据恢复中心的工程师分析&#xff…

Talk | UCSD博士生刘明华:在开放的世界中理解和生成3D物体

本期为TechBeat人工智能社区第539期线上Talk。 北京时间10月19日&#xff08;周四&#xff09;20:00&#xff0c;加州大学圣地亚哥分校博士生—刘明华的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “在开放的世界中理解和生成3D物体”&#xff0…

未来装备探索:数字孪生装备

源自&#xff1a;《计算机集成制造系统》 作者&#xff1a;陶飞 张辰源 张贺 程江峰 邹孝付 徐慧 王勇 谢兵兵 “人工智能技术与咨询” 发布 摘 要 工程装备、制造装备、医疗装备等各类装备是加快国家基础建设&#xff0c;提升国家经济实力和保障医疗健康的重要…