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

devtools/2025/1/17 2:25:57/

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.ppmy.cn/devtools/151144.html

相关文章

java 如何判断两个List<String>集合是否存在交集

在 Java 中判断两个 List<String> 集合是否存在交集&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用 retainAll 方法 retainAll 方法保留集合中与另一个集合相同的元素&#xff0c;如果集合发生变化&#xff0c;则表示存在交集。 List<Strin…

【计算机视觉】超简单!插值算法经典案例

Hey小伙伴们&#xff01;今天来给大家分享一个 计算机视觉 中非常基础但又超级重要的技术——插值算法。插值在图像处理中扮演着至关重要的角色&#xff0c;尤其是在图像缩放、旋转、变形等操作时。通过插值算法&#xff0c;我们可以在不失真的情况下调整图像的大小或形状。 如…

MySQL 排除指定时间内重复记录的解决方案

MySQL 排除指定时间内重复记录的解决方案 在实际的数据库操作中,我们经常需要排除时间间隔小于一定范围(例如 5 分钟)的重复记录。本文总结了几种实现这一需求的 MySQL 解决方案。 表结构 假设我们有一张记录数据的表 event_logs,其结构如下: CREATE TABLE event_logs…

Unity 3D游戏开发从入门进阶到高级

本文精心整理了Unity3D游戏开发相关的学习资料&#xff0c;涵盖入门、进阶、性能优化、面试和书籍等多个维度&#xff0c;旨在为Unity开发者提供全方位、高含金量的学习指南.欢迎收藏。 学习社区 Unity3D开发者 这是一个专注于Unity引擎的开发者社区&#xff0c;汇聚了众多Un…

HTML5 加载动画(Loading Animation)

加载动画&#xff08;Loading Animation&#xff09;详解 概述 加载动画是指在数据加载过程中&#xff0c;向用户展示的一种视觉效果&#xff0c;旨在提升用户体验&#xff0c;告知用户系统正在处理请求。它可以减少用户的等待焦虑感&#xff0c;提高界面的互动性。 常见的加…

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器&#xff0c;基于 Region 内存布局的&#xff0c;不设分代&#xff0c;使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障&#xff0c;而 ZGC 用到了读屏障 染色指针&a…

洛谷P2404 自然数的拆分问题 刷题笔记 DFS

题目链接https://www.luogu.com.cn/problem/P2404 一道深搜问题 注意观察答案的特点 得出判断合法答案的条件如何表述 观察答案特点 后面的数要比前面的数大 因此我们要加入一些判断 来保证答案合法 逐个数字进行拆分 用数组存答案 如果一个数是奇数 分解成两个数相加…

C/C++中,const、static关键字有什么作用,如何定义、初始化,什么情形下需要用到这两关键字?

在C和C编程中&#xff0c;const和static是两个非常重要的关键字&#xff0c;它们各自有独特的作用和使用场景。下面分别介绍这两个关键字的作用、定义和初始化方法&#xff0c;以及何时需要使用它们。 const 关键字 作用 const关键字用于声明一个变量为常量&#xff0c;即该…