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

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

242.有效的字母异位词

题目链接:242.有效的字母异位词
文档讲解:代码随想录有效的字母异位词
视频讲解:LeetCode:有效的字母异位词
状态:学会了

思路:
数组其实是简单哈希表
哈希表用来快速判断元素是否在一个集合里面出现
哈希表(数组):需要把字符映射到数组也就是哈希表的索引下标,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射下标0,相应字符z映射为下标25。哈希表设计为长为26的数组。哈希函数为s[i] - ‘a’,映射为字符的ASCII值。最后record数组有元素不为零,说明字符串s和t一定是字符数不同,return false。否则遍历后,return true。

  • 时间复杂度:O(n)
  • 空间复杂度:O(1),record是定义的一个常量大小的辅助数组。
// 哈希表:数组就行
class Solution {
public:bool isAnagram(string s, string t) {// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了int record[26] = {0};// 记录s字母情况for (int i = 0; i < s.size(); i++) {record[s[i] - 'a']++;}// 记录t字母情况for (int i = 0; i < t.size(); i++) {record[t[i] - 'a']--;}// 判断是否数组元素都为0// record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。for (int i = 0; i < 26; i++) {if (record[i] != 0) return false;}// record数组所有元素都为零0,说明字符串s和t是字母异位词return true;}
};

349. 两个数组的交集

题目链接:349. 两个数组的交集
文档讲解:代码随想录两个数组的交集
视频讲解:LeetCode:两个数组的交集
状态:学会了

思路:
这道题不能用 数组 来做,原因是使用数组来做哈希的题目,是因为题目都限制了数值的大小而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。但是这道题没有,所以考虑哈希表另一种常见类型。
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

哈希表(unordered_set):设计一个ordered_map来存储交集元素,返回是一个数组。去重记录,比较,然后存储,最后转换。思路如下:
在这里插入图片描述

  • 时间复杂度:O(n+m),m是因为最后set转换为vector
  • 空间复杂度:O(n)
// 哈希表:unordered_set
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {// 哈希表 :unordered_set:去重、无序、快unordered_set<int> result_set;// 去重nums1unordered_set<int> nums1set(nums1.begin(), nums1.end());// 在nums2中查找for (int num : nums2) {// 发现nums2的元素 在nums_set里又出现过if (nums1set.find(num) != nums1set.end()) {result_set.insert(num);}}// 返回数组形式return vector<int>(result_set.begin(), result_set.end());}
};

注意:哈希问题不能都用 set 来解决,因为:直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。不要小瞧 这个耗时,在数据量大的情况,差距是很明显的。

补充:本题后面 力扣改了 题目描述 和 后台测试数据,增添了 数值范围。所以就可以 使用 数组 来做哈希表了, 因为数组都是 1000以内的。

202. 快乐数

题目链接:202. 快乐数
文档讲解:代码随想录快乐数
状态:学会了

思路:
哈希表(unordered_set):题目出现 无限循环 ,也就是说明求和的过程中,sum会重复出现。所以我们需要快速判断sum这个元素是否出现在集合里面,考虑哈希法,重复了就 return false;,否则一直找到sum == 1为止。

  • 时间复杂度:O(logn)
  • 空间复杂度:O(logn)
// 哈希表:unordered_set
class Solution {
public:// 哈希表:unordered_set// 判断sum是否重复出现 出现返回false 否则一直找到sum=1为止// 取数值各个位上的单数之和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;}}
};

注意:如何对取数值各个位上的单数操作:

while (n) {sum += (n % 10) * (n % 10);n /= 10;
}

补充:时间复杂度解释:
在这里插入图片描述
空间复杂度同样和原始数字 n 的位数相关,也就是与 O(logn)相关(这里的 n 是最初传入 getSum 函数的数字)。

1. 两数之和

题目链接:1. 两数之和
文档讲解:代码随想录两数之和
视频讲解:LeetCode:两数之和
状态:学会了

思路:
本道题中,不仅需要判断元素是否遍历过,还需要返回元素下标,所以需要 key value 结构来存储,key来存放元素,value来查询放下标,这就是map
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 这道题目中并不需要key有序,选择std::unordered_map 效率更高!
使用 map 需要明白两点:用map来做什么?map中key和value分别表示什么?
哈希表(unordered_map):map 用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(相加等于target)。map中的存储结构为:{key:数组元素, value:数组元素对应的下标}。流程为:遍历数组,判断是否存在满足条件的key,有则返回下标,没有则将元素存入map。

  • 时间复杂度: O(n)
  • 空间复杂度:O(n)
// 哈希表:unordered_map
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {// 哈希表:unordered_map// 我需要遍历+下标-> key valueunordered_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};} else {map.insert(pair<int, int>(nums[i], i));}}        return {};}
};

补充:
使用 数组 和 set 来做哈希法的局限:

  • 数组 的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set 是一个集合,里面放的元素只能是一个key,而两数之和这道题,不仅要判断y是否存在还要记录y的下标位置,因为要返回 x 和 y 的下标,所以set不能用。
  • 这里只能选择数据结构:map,是一种 key value的存储结构,可以用key保存数值,value再保存数值所在的下标。

map.find():是unordered_map的一个成员函数,返回的是一个迭代器。迭代器是一种对象,它可以指向容器中的某个元素,并且支持一些操作,如移动到下一个元素、访问当前元素(value :iter->second)等。如果map中存在这个key的元素,iter会指向这个元素;若不存在,iter会等于map.end()。

{nums[i], i}:是c++中一种初始化列表的语法,用来初始化一个std::vector对象。

相关文章:

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

242.有效的字母异位词 题目链接&#xff1a;242.有效的字母异位词 文档讲解&#xff1a;代码随想录有效的字母异位词 视频讲解&#xff1a;LeetCode&#xff1a;有效的字母异位词 状态&#xff1a;学会了 思路&#xff1a; 数组其实是简单哈希表。 哈希表用来快速判断元素是否在…...

dify实现分析-rag-关键词索引的实现

概述 在dify中有两种构建索引的方式&#xff0c;一种是经济型&#xff0c;另一种是高质量索引&#xff08;通过向量数据库来实现&#xff09;。其中经济型就是关键词索引&#xff0c;通过构建关键词索引来定位查询的文本块&#xff0c;而关键词索引的构建是通过Jieba这个库来完…...

【小白学HTML5】一文讲清常用单位(px、em、rem、%、vw、vh)

html5中&#xff0c;常用的单位有px、em、rem、%、vw、vh&#xff08;不常用&#xff09;、cm、m等&#xff0c;这里主要讲解px、em、rem、%、vw。 学习了解&#xff1a;主流浏览器默认的字号&#xff1a;font-size:16px&#xff0c;无论用什么单位&#xff0c;浏览器最终计算…...

Fastgpt学习(5)- FastGPT 私有化部署问题解决

1.☺ 问题描述&#xff1a; Windows系统&#xff0c;本地私有化部署&#xff0c;postgresql数据库镜像日志持续报错" data directory “/var/lib/postgresql/data” has invalid permissions "&#xff0c;“ DETAIL: Permissions should be urwx (0700) or urwx,gr…...

ubuntu下安装TFTP服务器

在 Ubuntu 系统下安装和配置 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;服务器可以按照以下步骤进行&#xff1a; 1. 安装 TFTP 服务器软件包 TFTP 服务器通常使用 tftpd-hpa 软件包&#xff0c;你可以使用以下命令进行安装&#xff1a; sudo apt update …...

深入解析 iText 7:从 PDF 文档中提取文本和图像

在现代开发中&#xff0c;PDF 文件的操作是不可避免的一部分。无论是生成报告、解析文档&#xff0c;还是从文件中提取信息&#xff0c;我们常常需要处理 PDF 文件。iText 是一个非常强大的库&#xff0c;广泛应用于 PDF 文件的创建、修改和解析。自 iText 7 发布以来&#xff…...

Rust编程语言入门教程 (六)变量与可变性

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…...

事务--实操演示

目录 一、准备工作 二、在MySQL中操作事务&#xff08;重点&#xff09; 第一种方式&#xff1a;使用命令的方式 第二种方式&#xff1a;设置MySQL事务不默认提交的方式 结 三、在JDBC中操作事务&#xff08;掌握&#xff09; 第一种方式&#xff1a;使用命令的方式 第…...

PHP是如何并行异步处理HTTP请求的?

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

【Spring详解一】Spring整体架构和环境搭建

一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构&#xff0c;包含一系列功能要素&#xff0c;被分为大约20个模块 Spring核心容器&#xff1a;包含Core、Bean、Context、Expression Language模块 Core &#xff1a;其他组件的基本核心&#xff…...

在 Vue 3 中使用 Lottie 动画:实现一个加载动画

在现代前端开发中&#xff0c;动画是提升用户体验的重要元素之一。Lottie 是一个流行的动画库&#xff0c;它允许我们使用 JSON 文件来渲染高质量的动画。本文将介绍如何在 Vue 3 项目中集成 Lottie 动画&#xff0c;并实现一个加载动画效果。 如果对你有帮助请帮忙点个&#x…...

深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作

一、问题背景&#xff08;传统爬虫的痛点&#xff09; 数据采集是现代网络爬虫技术的核心任务之一。然而&#xff0c;传统爬虫面临多重挑战&#xff0c;主要包括&#xff1a; 反爬机制&#xff1a;许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫&#xff0c;进而限制…...

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器&#xff08;主服务器&#xff0c;Master&#xff09;复制到一个或多个 MySQL 数据库服务器&#xff08;从服务器&#xff0c;Slave&#xff09;的技术。以下简述其原理&#xff0c;主要包含三个核…...

计算机网络抄手 运输层

一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...

字符串函数和结构题内存对齐

图下为函数使用&#xff1a; #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }...

【嵌入式Linux应用开发基础】特殊进程

目录 一、守护进程&#xff08;Daemon Process&#xff09; 1.1. 概念 1.2. 特点 1.3. 守护进程的命名 1.4. 创建守护进程的步骤 1.5. 守护进程的实例 1.6. 守护进程的管理 1.7. 影响与处理 二、僵尸进程&#xff08;Zombie Process&#xff09; 2.1. 僵尸进程的定义…...

深度学习pytorch之19种优化算法(optimizer)解析

提示&#xff1a;有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法&#xff0c;包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等&#xff0c;通过对这些算法的公式和参数说明进行详细解析…...

rust笔记5-derive属性2

在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…...

介绍cherrypick

git cherry-pick 是 Git 中的一个强大命令&#xff0c;用于将一个或多个提交&#xff08;commit&#xff09;从一个分支应用到另一个分支。它允许你选择性地将特定的变更引入到当前分支&#xff0c;而无需合并整个分支。以下是对 git cherry-pick 操作的详细介绍&#xff1a; 1…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...