代码随想录算法训练营第六天 |哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集 、202. 快乐数、 1. 两数之和

news/2024/4/20 11:54:57/文章来源:https://blog.csdn.net/weixin_51233575/article/details/129146903

打卡第六天,补昨天的卡

今日任务

  • 哈希表理论基础
  • 242.有效的字母异位词
  • 349.两个数组的交集
  • 202.快乐数
  • 1.两数之和

哈希表理论基础

哈希表是根据关键码的值而直接进行访问的数据结构。

哈希表能解决什么问题呢?

一般哈希表都是用来快速判断一个元素是否出现集合里

常见的三种哈希表:

  • 数组
  • set(集合):
  • map(映射):

242.有效的字母异位词

在这里插入图片描述

我的解题

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

把s的每一个字符丢进哈希表,然后遍历 t ,判断每个字符是否都出现在哈希表中,并且数量相同,多一个少一个都是false。

349.两个数组的交集

在这里插入图片描述

我的解题

暴力做法

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> res;sort(nums2.begin(), nums2.end());for(int i = 0; i < nums2.size(); i++) {for(int j = 0; j < nums1.size(); j++) {if(nums1[j] == nums2[i]) {if(i > 0 && nums2[i - 1] == nums2[i]) break;res.push_back(nums1[j]);break;    }}}return res;}
};

将 nums2 排序,为什么要排序,因为题目要求结果每一个元素要唯一,排完序,当我们判断,后一个元素等于前一个元素,就可以直接跳过这个元素,这样不会造成结果元素不唯一。

返回第一层循环遍历 nums2,选定一个 nums2 元素,第二层循环遍历 nums1,查找nums1中是否有与 选定的 nums2 元素 相等的元素,有就存入结果集,并且跳出第二层循环,如果不 break,结果会重复。

哈希法

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {sort(nums2.begin(), nums2.end());unordered_set<int> mySet(nums1.begin(), nums1.end());vector<int> res;// for(int i = 0; i < nums1.size(); i++) {//     mySet.insert(nums1[i]);// }for(int i = 0; i < nums2.size(); i++) {if(mySet.find(nums2[i]) != mySet.end()) {if(i > 0 && nums2[i] == nums2[i - 1]) continue;res.push_back(nums2[i]);}	}return res;}
};

把 nums1 全部丢进去 unordered_set,循环遍历nums2,当在哈希表找到了于 nums2 相同的元素,存入结果集。

代码随想录

set做法

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重unordered_set<int> nums_set(nums1.begin(), nums1.end());for (int num : nums2) {// 发现nums2的元素 在nums_set里又出现过if (nums_set.find(num) != nums_set.end()) {result_set.insert(num);}}return vector<int>(result_set.begin(), result_set.end());}
};

拓展:

直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。

不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。

数组做法

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int hash[1010] = {0};unordered_set<int> res;for(int i = 0; i < nums1.size(); i++) hash[nums1[i]] = 1;for(int i = 0; i < nums2.size(); i++) {if(hash[nums2[i]]) res.insert(nums2[i]);}return vector<int>(res.begin(), res.end());}
};

202.快乐数

在这里插入图片描述

我的解题

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

计算 该数每个位置上的数字的平方和。

int work(int n) {int res = 0;while(n) {res += (n % 10) * (n % 10);n /= 10;}return res;
} 

每一次计算都要判断是不是等于1,等于1就是快乐数,那什么时候不是快乐数,如果每一次计算每个位置上的数字的平方和 与前面某一次计算结果一样,就永远不可能等于 1。

例如示例2:
2=0+22=42 = 0 + 2^2 = 42=0+22=4
4=0+44=164 = 0 + 4^4 = 164=0+44=16
16=12+62=3716 = 1^2 + 6^2 = 3716=12+62=37
37=32+72=5837 = 3^2 + 7^2 = 5837=32+72=58
58=52+82=8958 = 5^2 + 8^2 = 8958=52+82=89
89=82+92=14589 = 8^2 + 9^2 = 14589=82+92=145
145=12+42+52=42145 = 1^2 + 4^2 + 5^2 = 42145=12+42+52=42
42=42+22=2042 = 4^2 + 2^2 = 2042=42+22=20
20=22+0=420 = 2^2 + 0 = 420=22+0=4

接下来继续计算,结果会一直循环,永远不会等于1。
所以用一个哈希表存储之前计算的结果,每次都判断是否跟之前结果重复,重复就返回 false。

代码随想录

!!!当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

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;}// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return falseif (set.find(sum) != set.end()) {return false;} else {set.insert(sum);}n = sum;}}
};

1.两数之和

在这里插入图片描述

我的解题

暴力做法

两层循环,先找一个数,再往后找一个数,相加判断是否等于target,不等于继续找,直到找到。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> res(2);for(int i = 0; i < nums.size(); i++) {for(int j = i + 1; j < nums.size(); j++) {if(target == nums[i] + nums[j]) {res[0] = i;res[1] = j;return res;}}}return res;}
};

不成功的哈希法

我一开始的想法是开一个 unorder_map ,把nums的数跟下标存进去,然后遍历寻找哈希表里是否有 target - nums[i],有的话就是找到结果。

但是后面发现我这样做,会重复选择两个元素相加,比如示例2,结果会是[0, 0]。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> myMap;for(int i = 0; i < nums.size(); i++) {myMap.insert(pair<int, int> (nums[i], i));}for(int i = 0; i < nums.size(); i++) {auto iter = myMap.find(target - nums[i]);if(iter != myMap.end()) return { i, iter->second};}return {};}
};

代码随想录

本题其实有四个重点:

  • 为什么会想到用哈希表?
    需要快速寻找一个数(target - nums[i]),所以考虑用哈希法

  • 哈希表为什么用map?
    题目需要返回的是下标,我们找的是值,需要存储两个数据,而map 是以键值对(pair类型)的形式存储数据,比较合适。

  • 本题map是用来存什么的?
    map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)

    因为map是存放访问过的元素,所以不会出现同一个元素在答案里重复出现的情况。因为当我们选择当前这个元素的时候,map里面只有在此之前访问过的元素,没有当前这个元素,所以像示例2,结果不会出现[0, 0]这个情况。

  • map中的key和value用来存什么的?
    map 的 key存放数组的元素,value存放数组元素的下标。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> myMap;for(int i = 0; i < nums.size(); i++) {auto iter = myMap.find(target - nums[i]);if(iter != myMap.end()) return { i, iter->second};myMap.insert(pair<int, int>(nums[i], i));}return {};}
};

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tr0ll1靶机训练

信息收集 主机探测 端口扫描 21,22,80端口开放通过浏览器访问并进行指纹识别&#xff0c;并没没有发现什么有用信息 测试 观察发现21端口开放&#xff08;ftp&#xff09;尝试进行匿名登录发现其中存在一个流量文件将其下载 并将文件用wirwshark打开&#xff0c;追踪其TCP流(…

BEV感知:DETR3D

3D检测&#xff1a;DETR3D前言MethodImage Feature Extracting2D-to-3D Feature TransformationLoss实验结果前言 在这篇paper&#xff0c;作者提出了一个更优雅的2D与3D之间转换的算法在自动驾驶领域&#xff0c;它不依赖于深度信息的预测&#xff0c;这个框架被称之为DETR3D…

【C进阶】数据的存储

文章目录:star:1. 数据类型:star:2. 整形在内存中的存储2.1 存储规则2.2 存储模式2.3 验证大小端模式:star:3. 数据范围3.1 整形溢出3.2 数据范围的求解3.3 练习:star:4. 浮点型在内存中的存储4.1 浮点数的存储规则4.2 练习5. :star::star:总结(思维导图)⭐️1. 数据类型 在了…

Android - 代码生成远程依赖库(阿里云)

一、注册 没有注册过阿里云且没有实名认证的点这里&#xff1a;阿里云官网 二、查看库 阿里云制品仓库Packages &#xff08;注&#xff1a;如果没有创建企业或个人使用&#xff0c;按照提示&#xff0c;选个人使用&#xff09; 三、选择类型 选择其中一个&#xff08;两…

传统巨头生“变”,中国毫米波雷达市场战火再升级

进入2023年&#xff0c;中国车载毫米波雷达市场战火明显升级。 一方面&#xff0c;愈演愈烈的份额抢夺战不仅仅存在于几大传统巨头之间&#xff0c;也快速转移到与国产供应商之间&#xff1b;随着部分外资巨头的本土化战略深入落地&#xff0c;同时对国产供应商造成了压力。 …

ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置gazebo仿真环境 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的rviz仿真环境后&#xff0c;现在来配置一下对…

MySQL数据库————MVCC

MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表&#xff0c;事务B修改了id2的name字段为李老四&#xff0c;但是没有提交&#xff0c;事务A查询id2的数据&#xff0c;得到name为李老四&#xff1b;事务B发生回滚&#xff0c;id2的数据的name又变回李四&…

性能测试知多少?怎样开展性能测试

看到好多新手&#xff0c;在性能需求模糊的情况下&#xff0c;随便找一个性能测试工具&#xff0c;然后就开始进行性能测试了&#xff0c;在这种情况下得到的性能测试结果很难体现系统真实的能力&#xff0c;或者可能与系统真实的性能相距甚远。 与功能测试相比&#xff0c;性能…

【Spring Boot 原理分析】- 自动配置

【Spring Boot 原理分析】- 自动配置 Condition 注解 Condition 是 Spring 4.0 增加的条件判断功能&#xff0c;通过这个功能可以实现选择的创建 Bean 操作 &#x1f451; 我们在使用 Spring 的时候&#xff0c;只需导入某个依赖的坐标&#xff0c;就可以直接通过 Autwired 注…

堆,堆构建,堆排序,PriorityQueue和TopN问题

零. 前言 堆作为一种重要的数据结构&#xff0c;在面笔试中经常出现&#xff0c;排序问题中&#xff0c;堆排序作为一种重要的排序算法经常被问道&#xff0c;大顶堆小顶堆的应用经常出现&#xff0c;经典的问题TopN问题也是堆的重要应用&#xff0c;因此&#xff0c;了解并掌握…

Mac - Spotlight(聚焦)

文章目录一、Mac 中 Spotlight 的使用1、调用/打开 Spotlight2、执行搜索3、Spotlight 设置二、Mac 上的 Spotlight 开发1、关于 Spotlight2、使用 NSMetadataQuery 搜索示例三、mds 和 fsevents四、命令行访问 Spotlight五、Core Spotlight Framework六、Spotlight 插件相关资…

CSS预处理器sass和less

文章目录CSS预处理器什么是CSS预处理器Sass和LESS背景介绍Sass背景介绍LESS的背景介绍Sass安装Sass下载Ruby安装文件安装Ruby安装Sass编译Sass命令行编译命令行编译配置选项四种编译排版演示nested 编译排版格式expanded 编译排版格式compact 编译排版格式compressed 编译排版格…

登录逻辑漏洞整理集合

目录一、任意用户注册1.未验证邮箱/手机号2、不安全验证邮箱/手机号3.批量注册4.个人信息伪造5.前端验证审核绕过6.用户名覆盖二、任意用户登录1、万能密码2、验证码、密码回显3、登录检测不安全三、任意账号重置1、重置账号名2、验证码3、MVC数据对象自动绑定4、Unicode字符处…

独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐

如果有关注我的 Twitter 的朋友应该看到了&#xff0c;我上周末研究了两天 AI 画图&#xff0c;现在用 Ai 做图太强了&#xff0c;上周又升级 Stable Diffusion 玩了一下&#xff0c;和我去年试的时候相比强大了好多&#xff0c;而且插件LoRA模型玩法都还在快速迭代&#xff0c…

强化学习DQN之俄罗斯方块

强化学习DQN之俄罗斯方块强化学习DQN之俄罗斯方块算法流程文件目录结构模型结构游戏环境训练代码测试代码结果展示强化学习DQN之俄罗斯方块 算法流程 本项目目的是训练一个基于深度强化学习的俄罗斯方块。具体来说&#xff0c;这个代码通过以下步骤实现训练&#xff1a; 首先…

车机开发【Android SystemUI 架构音量控制详解】

SystemUI介绍 SystemUI摘要 在Android系统中SystemUI是以应用的形式运行在Android系统当中&#xff0c;即编译SystemUI模块会生产APK文件&#xff0c;源代码路径在frameworks/base/packages/SystemUI/&#xff0c;安装路径system/priv-app/-SystemUI。 什么是SystemUI 在前…

使用带有 Moveit 的深度相机来避免碰撞

文章目录 什么是深度相机?如何将 Kinect 深度相机添加到您的环境中在 Rviz 中可视化深度相机数据在取放场景中使用深度相机将深度相机与您的 Moveit 设置一起使用有很多优势。机器人可以避免未知环境中的碰撞,甚至可以对周围的变化做出反应。然而,将深度相机连接到您的设置并…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码&#xff0c;支持面向用户级别的行级数据访问控制&#xff0c;即特定用户只能访问授权过的行&#xff0c;隐藏未授权的行数据。此方案是实时领域Flink的解决方案&#xff0c;类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

数据分片(mycat)

1. 数据分片概念&#xff1a; 1.1. 分库分表 什么是分库分表&#xff1a; 将存放在一台数据库服务器中的数据&#xff0c;按照特定方式&#xff08;指的是程序开发的算法&#xff09;进行拆分&#xff0c;分散存放到多台数据库服务器中&#xff0c;以达到分散单台服务器负载的…

第51篇-某彩网登录参数分析-webpack【2023-02-21】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析一、前言 今天我们看一个webpack的网站 aHR0cHM6Ly8xMGNhaTUwMC5jYy9sb2dpbg==二、网站分析 首先…