算法训练之 -- 螺旋矩阵
螺旋矩阵
1. 思路
题目:给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。59. 螺旋矩阵 II - 力扣(LeetCode)
思路:
初始化一个 n×n 大小的矩阵 res,然后模拟整个向内环绕的填入过程:填充上行从左到右,填充右列从上到下,填充下行从右到左,填充左列从下到上
- 定义当前左右上下边界 left,right,top,bottom,初始值 num = 1,迭代终止值 tar = n * n;
- 当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
- 执行 num += 1:得到下一个需要填入的数字;
- 更新边界:例如从左到右填完后,上边界 top += 1,相当于上边界向内缩 1。
- 使用num <= tar 或者 left <= right && top < bottom作为迭代条件。
- 最终返回 res 即可。
PS:一定要注意区间的开合,四个方向的填充使用同样的开合方式!
2. 解法
Python
1 |
|
C++
1 |
|
3. 变种
(1) 题目:给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。54. 螺旋矩阵 - 力扣(LeetCode)
思路:可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。(和上面的那个相反)
对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于 (top,left),右下角位于 (bottom,right),按照如下顺序遍历当前层的元素。
从左到右遍历上侧元素,依次为 (top,left) 到 (top,right)。
从上到下遍历右侧元素,依次为 (top,right) 到 (bottom+1,right)。
从右到左遍历下侧元素,依次为 (bottom, right) 到 (bottom, left-1)
从下到上遍历左侧元素,依次为 (bottom, left) 到 (top-1, left)
每次遍历完都判断一下 (l > r or t > b),来决定是否结束循环。
PS:也需要注意区间开合,以及结束条件(此题的矩阵不一定为正方形)
Python
1 |
|
C++
1 |
|
(2) 题目:给定一个二维数组 array
,请返回「螺旋遍历」该数组的结果。螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素LCR 146. 螺旋遍历二维数组 - 力扣(LeetCode)
思路:螺旋矩阵的题目好像都没啥差别,没有很大的改变,记住一个模板就行了。还有一种遍历到矩阵中间的位置,但是用复杂度没有很大差别,没必要特意用。注意一些细节就好了,尤其是边界位置,没很大意思。
Python
1 |
|
C++
1 |
|