废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是螺旋矩阵,使用【二维数组】这个基本的数据结构来实现
螺旋矩阵【EASY】
二维数组的结构特性入手
题干
解题思路
根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]]
的对应输出 [1,2,3,6,9,8,7,4,5]
可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。
因此,考虑设定矩阵的 “左、上、右、下” 四个边界,模拟以上矩阵遍历顺序,算法流程:
- 空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。
- 初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。
- 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。
- 根据边界打印,即将元素按顺序添加至列表 res 尾部。
- 边界向内收缩 1 (代表已被打印)。
- ** 判断边界是否相遇**(是否打印完毕),若打印完毕代表下一个方向无需打印,则跳出。
- 返回值: 返回 res 即可。
整体的打印过程
代码实现
基本数据结构:数组
辅助数据结构:无
算法:无
技巧:无
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param matrix int整型二维数组* @return int整型ArrayList*/public ArrayList<Integer> spiralOrder (int[][] matrix) {// 1 入参判断,如果为空数组,返回空集合if (matrix.length < 1) {return new ArrayList<Integer>();}// 2 定义四条边及返回值ArrayList<Integer> result = new ArrayList<Integer>();int left = 0;int right = matrix[0].length - 1;int top = 0;int bottom = matrix.length - 1;// 3 循环打印四条边while (true) {// 3-1 从左向右打印,明确左右边界,打印完后上边界向下移动,并判断是否有必要继续从上到下打印for (int i = left; i <= right; i++) {result.add(matrix[top][i]);}if (++top > bottom) {break;}// 3-2 从上向下打印,明确上下边界,打印完后右边界向左移动,并判断是否有必要继续从右到左打印for (int i = top; i <= bottom; i++) {result.add(matrix[i][right]);}if (left > --right) {break;}// 3-3 从右向左打印,明确左右边界,打印完后下边界向上移动,并判断是否有必要继续从下到上打印for (int i = right; i >= left; i--) {result.add(matrix[bottom][i]);}if (top > --bottom) {break;}// 3-4 从下向上打印,明确上下边界,打印完后左边界向右移动,并判断是否有必要继续从左到右打印for (int i = bottom; i >= top; i--) {result.add(matrix[i][left]);}if (++left > right) {break;}}return result;}
}
++top > bottom
等价于先给 top 自增 1 ,再判断++top > bottom
逻辑表达式
复杂度分析
- 时间复杂度 O(MN) : M,N分别为矩阵行数和列数。
- 空间复杂度 O(1) : 四个边界 l , r , t , b 使用常数大小的额外空间。
拓展知识:二维数组
二维数组是一种常见的数据结构,它由多行和多列组成,可以用来存储和处理二维数据集合,例如矩阵、表格、图像、地图等。在不同的编程语言中,定义和使用二维数组的方式可能有所不同,以下是一些常见编程语言中的示例。
C/C++:
// 定义一个3x3的整数二维数组
int matrix[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 访问元素
int element = matrix[1][2]; // 获取第二行第三列的元素,值为6
Python:
# 定义一个3x3的整数二维数组(使用嵌套列表)
matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]
]# 访问元素
element = matrix[1][2] # 获取第二行第三列的元素,值为6
Java:
// 定义一个3x3的整数二维数组
int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 访问元素
int element = matrix[1][2]; // 获取第二行第三列的元素,值为6
常用方法和操作:
-
访问元素: 使用索引来访问二维数组中的特定元素,例如
matrix[i][j]
,其中i
表示行号,j
表示列号。 -
遍历二维数组: 使用嵌套循环来遍历二维数组,通常使用一个循环迭代行,另一个循环迭代列,以访问所有元素。
-
初始化: 在定义二维数组时,可以初始化数组的值。可以使用嵌套列表(Python)、嵌套数组(C/C++)或类似方式来初始化。
-
修改元素: 可以通过索引来修改特定元素的值,例如
matrix[i][j] = newValue
。 -
获取数组的行数和列数: 可以使用数组的长度或大小来获取行数和列数。
-
在算法中使用: 二维数组在解决各种问题时非常有用,例如矩阵运算、图算法、迷宫求解等。
-
释放内存(C/C++): 在使用动态分配内存创建二维数组时,需要谨慎释放内存以防止内存泄漏。
二维数组是一种非常灵活和强大的数据结构,可以在各种应用中发挥作用,从简单的数据存储到复杂的算法实现。