算法刷题之四二维列表
1|0列表
一维列表
- 删除排序数组中的重复项
- 移动非0元素到头部
- 盛最多水的容器
- 删除排序数组中的重复项
- 长度最小的子数组
- 无重复字符的最长子串
- 前缀和
- 三数之和
- 合并区间
二维列表
- 二维矩阵最大子矩阵和
- 旋转图像
- 杨辉三角
- 对角线遍历
- 矩阵元素查找
- 容器盛水
2|0二维矩阵最大子矩阵和
题目:
方法:二维矩阵的子矩阵中和最大的。首先要明确的是子矩阵是长方形而不是正方形。在二维矩阵中确定一个子矩阵的方法是确定矩阵的左上角和右下角。确定左上角就是确定x,y,使用两层for循环可以遍历到任意一个左上角。同理两层for循环也可以遍历到一个右下角。
暴力循环
两个for循环确定矩阵左上角;两个for循环确定矩阵右下角。两个for循环确定子矩阵和
知识点
: 二维列表的遍历
方法
: 暴力循环的方法时间复杂度简直吓人。在一维列表中有最大子列表的题目,那么将二维列表变成一维列表来处理是否可行呢?就是将多行压缩成一行,然后在一行中找最大子序列和。
首先将二维列表所有的子列表都找出来,结果如下
然后将二维子列表压缩成一维,这样一个一维列表就代表者二维子列表的和。
最后对所有一维列表求最大子序列和,结果即为二维列表的最大和子列表
动态规划
将多行压缩成一行,对一维矩阵求最大值。3行的矩阵可以有6个行子矩阵
3|0旋转图像
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnhhkv/
方法:有两种方法可解决矩阵旋转问题:
- 按照旋转规律,置换方格位置
- 先上下翻转,然后对角折叠
第一种方法:
由外层到内层,分别处理每一层。每一层中分别处理顶点到内部的位置。
第二种方法:
4|0对角线遍历
题目:
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
![image_1el70dt1oudg14e6bnsg331ibn9.png-24kB][19]
方法:利用每一次输出的值坐标相加等于一个固定值这一个特征,将所有相同的坐标值放在一个字典中,判断是否翻转完成正确输出
知识点
: 二维列表的遍历
5|0矩阵元素查找
题目:
已知int一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的。设计查找算法返回所查找元素的二元数组,代表该元素的行号和列号(均从零开始)。保证元素互异。
示例1
输入:
[[1,2,3],[4,5,6]],2,3,6
返回值:
[1,2]
方法:根据二维列表的特性,每一行都是从小到大,每一列都是从小到大。那么每一行的最后一个值肯定是最大的,判断targe与每一行最大的值,如果小于则肯定在下面,如果大于则在当前行。在当前行时向前遍历判断,值越来越小,如果存在肯定能找到。
知识点
:二维列表的遍历
6|0容器盛水
题目:
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
示例1
输入:
[3,1,2,5,2,4]
返回值:
5
示例2
输入:
[4,5,1,3,2]
返回值:
2
方法:找到每一个柱子的左边最大值和右边最大值,如果柱子的高度小于较小的那一个,就说明可以盛水。
本题可以使用的解法:
- 暴力,遍历每一个柱子,同时遍历得到柱子两边的最大值
- 动态规划,首先维护两个数组,每一个柱子左边最大值和右边最大值
- 先找到最高的柱子,然后从两边向最高的柱子进发
方法:先找到最大值,然后从两边向最大值靠近。在靠近的过程中,如果大于左边则没有盛水,如果小于左边则以左边为最小值来算盛水。
7|0二维列表小结
对于二维列表的操作技巧有 化二维为一维
,而遵循最基础操作的思想,总结二维列表的操作,那就是循环。
普通循环
:使用双层循环能够找到列表中任意一个元素。
10
22
68
41
23
66
28
88
84
子矩阵
:在二维列表中找出所有的子矩阵。在二维列表中确定一个左上角和一个右下角,就能确定一个子矩阵(包括一个点或多个点)。那么同时控制两个点就需要4层循环。
左上角:10 -- 右下角:10
左上角:10 -- 右下角:22
左上角:10 -- 右下角:68
左上角:10 -- 右下角:41
左上角:10 -- 右下角:23
左上角:10 -- 右下角:66
左上角:10 -- 右下角:28
左上角:10 -- 右下角:88
左上角:10 -- 右下角:84
左上角:22 -- 右下角:22
左上角:22 -- 右下角:68
左上角:22 -- 右下角:23
左上角:22 -- 右下角:66
左上角:22 -- 右下角:88
左上角:22 -- 右下角:84
左上角:68 -- 右下角:68
左上角:68 -- 右下角:66
左上角:68 -- 右下角:84
左上角:41 -- 右下角:41
左上角:41 -- 右下角:23
左上角:41 -- 右下角:66
左上角:41 -- 右下角:28
左上角:41 -- 右下角:88
左上角:41 -- 右下角:84
左上角:23 -- 右下角:23
左上角:23 -- 右下角:66
左上角:23 -- 右下角:88
左上角:23 -- 右下角:84
左上角:66 -- 右下角:66
左上角:66 -- 右下角:84
左上角:28 -- 右下角:28
左上角:28 -- 右下角:88
左上角:28 -- 右下角:84
左上角:88 -- 右下角:88
左上角:88 -- 右下角:84
左上角:84 -- 右下角:84
单纯的二维列表并没有太多操作技巧,二维列表的更多操作是在动态规划中,能秀到眼花缭乱。
__EOF__

本文链接:https://www.cnblogs.com/goldsunshine/p/14921587.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理