LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
10.3 数组
# 10.3 数组 ## [448. Find All Numbers Disappeared in an Array](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/) ### 题目描述 给定一个长度为 n 的数组,其中包含范围为 1 到 n 的整数,有些整数重复了多次,有些整数没有出现,求 1 到 n 中没有出现过的整数。 ### 输入输出样例 输入是一个一维整数数组,输出也是一个一维整数数组,表示输入数组内没出现过的数字。 ``` Input: [4,3,2,7,8,2,3,1] Output: [5,6] ``` 利用数组这种数据结构建立 n 个桶,把所有重复出现的位置进行标记,然后再遍历一遍数组,即可找到没有出现过的数字。进一步地,我们可以直接对原数组进行标记:把重复出现的数字-1在原数组的位置设为负数(这里-1 的目的是把 1 到 n 的数字映射到 0 到 n-1 的位置),最后仍然为正数的位置 +1 即为没有出现过的数。 ### 题解 ```py def findDisappearedNumbers(nums: List[int]) -> List[int]: for num in nums: pos = abs(num) - 1 if nums[pos] > 0: nums[pos] = -nums[pos] return [i + 1 for i in range(len(nums)) if nums[i] > 0] ``` ## [48. Rotate Image](https://leetcode.com/problems/rotate-image/) ### 题目描述 给定一个 n × n 的矩阵,求它顺时针旋转 90 度的结果,且必须在原矩阵上修改(in-place)。怎样能够尽量不创建额外储存空间呢? ### 输入输出样例 输入和输出都是一个二维整数矩阵。 ``` Input: [[1,2,3], [4,5,6], [7,8,9]] Output: [[7,4,1], [8,5,2], [9,6,3]] ``` ### 题解 每次只考虑四个间隔 90 度的位置,可以进行 O(1) 额外空间的旋转。 <figure> <span style={{ display: 'block', width: '30%', margin: '0 auto' }}>  </span> <figcaption style={{ textAlign: 'center' }}>图 10.1: 题目 48 - $O(1)$ 空间旋转样例,相同颜色代表四个互相交换的位置</figcaption> </figure> ```py def rotate(matrix: List[List[int]]) -> None: n = len(matrix) - 1 for i in range(n // 2 + 1): for j in range(i, n - i): pivot = matrix[j][n - i] matrix[j][n - i] = matrix[i][j] matrix[i][j] = matrix[n - j][i] matrix[n - j][i] = matrix[n - i][n - j] matrix[n - i][n - j] = pivot ``` ## [240. Search a 2D Matrix II](https://leetcode.com/problems/search-a-2d-matrix-ii/) ### 题目描述 给定一个二维矩阵,已知每行和每列都是增序的,尝试设计一个快速搜索一个数字是否在矩阵中存在的算法。 ### 输入输出样例 输入是一个二维整数矩阵,和一个待搜索整数。输出是一个布尔值,表示这个整数是否存在于矩阵中。 ``` Input: matrix = [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]], target = 5 Output: true ``` ### 题解 这道题有一个简单的技巧:我们可以从右上角开始查找,若当前值大于待搜索值,我们向左移动一位;若当前值小于待搜索值,我们向下移动一位。如果最终移动到左下角时仍不等于待搜索值,则说明待搜索值不存在于矩阵中。 ```py def searchMatrix(matrix: List[List[int]], target: int) -> bool: m, n = len(matrix), len(matrix[0]) i, j = 0, n - 1 while i < m and j >= 0: if matrix[i][j] == target: return True if matrix[i][j] < target: i += 1 else: j -= 1 return False ``` ## [769. Max Chunks To Make Sorted](https://leetcode.com/problems/max-chunks-to-make-sorted/) ### 题目描述 给定一个含有 0 到 n 整数的数组,每个整数只出现一次,求这个数组最多可以分割成多少个子数组,使得对每个子数组进行增序排序后,原数组也是增序的。 ### 输入输出样例 输入一个一维整数数组,输出一个整数,表示最多的分割数。 ``` Input: [1,0,2,3,4] Output: 4 ``` 在这个样例中,最多分割是 [1, 0], [2], [3], [4]。 ### 题解 从左往右遍历,同时记录当前的最大值,每当当前最大值等于数组位置时,我们可以多一次分割。 为什么可以通过这个算法解决问题呢?如果当前最大值大于数组位置,则说明右边一定有小于数组位置的数字,需要把它也加入待排序的子数组;又因为数组只包含不重复的 0 到 n,所以当前最大值一定不会小于数组位置。所以每当当前最大值等于数组位置时,假设为 p,我们可以成功完成一次分割,并且其与上一次分割位置 q 之间的值一定是 q +1 到 p 的所有数字。 ```py def maxChunksToSorted(arr: List[int]) -> int: chunks, cur_max = 0, 0 for i, num in enumerate(arr): cur_max = max(cur_max, num) chunks += cur_max == i return chunks ```
嘉心糖糖
2025年3月11日 19:34
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码