LeetCode | 解锁数组与字符串的秘密:经典题型详解与高效解法

1.理论

1. 1.核心概念

1.1.1.数组(Array)

定义:存储相同数据类型的元素的线性集合。

特点:支持随机访问(通过索引);元素存储在连续内存中,支持高效的读写操作。

时间复杂度:访问:O(1);插入/删除:O(n)(平均情况下需要移动元素)

1.1.2.字符串(String)

定义:字符的序列,通常以数组的形式存储。

特点:通常是不可变(如 Python 的字符串类型);涉及字符串操作时,额外空间的开销可能较大(如拼接操作)。

时间复杂度:访问字符:O(1);拼接:O(n)(取决于实现方式)

1.2. 常考算法技巧

1.2.1.双指针

用途:解决数组/字符串的遍历问题,尤其是涉及两个元素关系的题目。

常见场景

- 对撞指针:从两端向中间逼近,解决回文检测、容器装水等问题。

- 快慢指针:用于环检测、删除重复元素等问题。

例题:盛最多水的容器,有效回文(Palindrome)

1.2.2.滑动窗口

用途:高效解决子数组或子串的相关问题。

常见场景

- 固定窗口:滑动窗口大小固定。

- 动态窗口:窗口根据条件动态调整大小。

例题:最长无重复子串,最小覆盖子串

1.2.3.前缀和

用途:快速计算区间和。

常见场景

- 求解固定区间的子数组和。

- 处理连续子数组满足某条件的题目。

例题

和为 K 的子数组

1.2.4.排序与分组

用途:借助排序对数组进行归类、寻找规律。

常见场景

对元素进行分组或分类(如字母异位词分组)。

最小或最大元素的快速计算。

例题:三数之和,合并区间

1.2.5.哈希表辅助

用途:提升查找效率。

常见场景

记录元素出现次数。

查找特定关系的元素对。

例题:两数之和,多数元素

1.3. 高频题型分类

1.3.1.子数组与子串问题

典型题目

最大子数组和(Kadane's Algorithm)

最长无重复子串

最小窗口子串

考察点:滑动窗口,动态规划

1.3.2.查找与排序问题

典型题目:两数之和,,三数之和,合并区间

考察点:排序后配合双指针,哈希表优化查找效率

1.3.3.数组变形问题

典型题目:螺旋矩阵,原地移除元素,旋转数组

考察点:模拟操作,空间优化

1.3.4.字符串匹配问题

典型题目:字符串相加,字符串反转,字符串排列

考察点:双指针操作,滑动窗口检测模式

2.真题

2.1.简单

【Leetcode 1】俩数之和 (Two Sum)

给定一个整数数组,返回两个数字的索引,使它们加起来等于 target.

示例 :

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:hash_map = {} # 创建一个哈希表,用于存储数值和其对应的索引for i, num in enumerate(nums): # 遍历数组,i 和 num 分别表示数组中元素的索引和对应的值complement = target - num # 计算需要的另一半数值if complement in hash_map: # 检查哈希表中是否有另一半数值return [hash_map[complement], i] 如果存在,则返回其索引和当前索引hash_map[num] = i  # 如果不存在,将当前数值和索引存入哈希表return []  # 如果没找到结果,返回空列表#哈希表 hash_map 动态存储遍历过的值和对应索引,并在每次迭代时检查是否已经满足条件。

运行过程

索引 i当前值 num目标差值 complement=target−num哈希表状态 num_map返回值
027{2: 0}-
172{2: 0}[0, 1]

在索引 1 时,目标差值 2 已经存在于哈希表中,因此返回 [0,1]。

最优分析:

  • 遍历一次数组:通过一次遍历和哈希表的辅助操作实现。
  • 哈希表查找速度快:查找另一个值是否存在的时间复杂度为 O(1)。
  • 无需额外排序:相比于双指针法(需要排序),此方法对数组原顺序无影响。

【Leetcode 11】盛最多水的容器

【Leetcode 53】最大子数组和

【Leetcode 438】找到字符串中所有异位词

【Leetcode 76】最小覆盖子串

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

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

相关文章

怎么修复损坏的U盘?而且不用格式化的方式!

当你插入U盘时,若电脑弹出“需要格式化才能使用”提示,且无法打开或读取其中的数据,说明U盘极有可能已经损坏。除此之外,若电脑在连接U盘后显示以下信息,也可能意味着U盘出现问题,需要修复损坏的U盘&#x…

数据结构漫游记:动态实现栈(stack)

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

【spring boot统一功能处理】拦截器

拦截器 在Spring Boot中,拦截器(Interceptor)是用于在处理请求前后进行一些自定义操作的组件,常用于日志记录、权限检查、性能监控等。拦截器的使用依赖于HandlerInterceptor接口和WebMvcConfigurer接口。 1. HandlerIntercepto…

qt自定义加载字体库ttf

在开发过程中,我们会用到其他的开源字体库,然而在打包后会在不同的电脑上遇到没有安装该字体的问题,以下是通过代码在main.cpp中添加字体示例,以供参考: int main(int argc, char *argv[]) {QApplication app(argc, a…

骑砍2霸主MOD开发(11)-可编程渲染管线Shader编程

一.固定渲染管线&可编程渲染管线 固定渲染管线:GPU常规渲染算法,将3D模型经过四大变换计算得到2D屏幕图像 可编程渲染管线:定制化GPU渲染算法,需要提交Shader至GPU中,GPU根据定制化算法得到2D屏幕图像 二.CoreShader&TerrainShader CoreShader:游戏中使用的静态shader…

w163美食推荐商城

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程,它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信,本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信,需要借助网络协议栈中的各层协议&#x…

Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)

当Mysql数据表存储大量数据时(百万级别数据),分页查询的性能问题是一个常见的挑战。特别是当使用LIMIT和OFFSET时,随着OFFSET的增加,查询性能会显著下降。原因在于MySQL需要扫描并跳过前面的行,这会导致I/O…

【Linux】Mysql部署步骤

一、JDK安装配置 在home目录下执行命令:mkdir Jdk 1.将JDK 上传至该文件夹,有些终端工具可以直接上传文件,比如:MobaXterm 可以看到安装包已经上传上来了 2.直接安装 命令:rpm -ivh jdk-8u311-linux-x64.rpm 3.安装成…

【0391】Postgres内核 checkpointer process ① 启动初始化

相关文章: 【0108】checkpointer运行原理(概念篇)(1) 【0278】checkpointer 共享内存(CheckpointerShmem)初始化(3) 文章目录 1. 启动 checkpointer process1.1 初始化 checkpointer PID1.2 注册 signal1.3 初始化 last checkpoint time2. 确认 config 的 shared memo…

归子莫的科技周刊#2:白天搬砖,夜里读诗

归子莫的科技周刊#2:白天搬砖,夜里读诗 本周刊开源,欢迎投稿。 刊期:2025.1.5 - 2025.1.11。原文地址。 封面图 下班在深圳看到的夕阳,能遇到是一种偶然的机会,能拍下更是一种幸运。 白天搬砖,…

你需要什么样的资源隔离?丨TiDB 资源隔离最佳实践

导读 资源隔离是数据库性能优化的重要环节, TiDB 在当前版本已经实现了从数据级隔离到流控隔离的全面升级 ,无论是多系统共享集群、复杂负载隔离,还是小型系统整合和 SQL 精细化控制,TiDB 都提供了灵活且高效的解决方案。 本文以…

w162体育馆管理系统

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

Java中对list数据进行手动分页(可直接复用版)

1.获取list列表数据 // 这边用的mybatisplus查询的sql。条件自己组装 List<实体类> result baseMapper.getPageData(lambdaQuery); 2.计算总记录数 // 计算总记录数 int totalRecords result.size(); 3.创建分页对象&#xff0c;并塞入结果值 // 创建分页对象 IPa…

cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…

C# 并发和并行的区别--16

目录 并发和并行 一.并发 定义 特点 代码示例 代码解释 二.并行 定义 特点 在C#中的体现 代码示例 代码解释 三.并发和并行的区别 四 .如何在C#中选择并发还是并行 1.考虑任务类型 2.代码示例 3.注意事项 五.总结 并发和并行 在编程领域,并发和并行是两个密切…

Android SystemUI——车载CarSystemUI加载(八)

Android 系统早期的状态栏和导航栏对于手机设备来说那是相当重要的,但是随着手机版本的不断更新,状态栏和导航栏对于手机的重要性在逐渐降低,特别是在快捷手势出现之后,导航栏几乎变得可有可无。但是对于当前如火如荼的车载系统来说,状态栏和导航栏却几乎是必备的,谷歌自…

《零基础Go语言算法实战》【题目 4-3】请用 Go 语言编写一个验证栈序列是否为空的算法

《零基础Go语言算法实战》 【题目 4-3】请用 Go 语言编写一个验证栈序列是否为空的算法 给定两个具有不同值的 push 和 pop 数组序列&#xff0c;当且仅当这可能是对最初为空的栈的一系 列 push 和 pop 操作的结果时才返回 true。 【解答】 ① 思路。 这是考查栈操作的题…

网络学习记录5

二、学习网络知识&#xff1a; 1、透传&#xff1a; ①“透传”指的是数据在传输过程中不被交换机或其他网络设备解析、修改或处理&#xff0c;而是直接从一个端口传输到另一个端口。这种传输方式保持了数据的原始性和完整性&#xff0c;常用于需要高速、低延迟的数据传输场景…

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…