算法的学习笔记—顺时针打印矩阵(牛客JZ29)
😀前言
在算法的学习过程中,二维数组的操作是一个非常重要的内容,其中顺时针打印矩阵是一个经典的问题。这个问题不仅考察我们对矩阵的理解,还要求我们具备较强的逻辑思维能力。本文将详细解析如何通过Java代码来实现这一功能。
😀顺时针打印矩阵
❤️🔥题目链接
🤔题目描述
给定一个二维矩阵,要求按照顺时针的顺序,从外到里依次打印出矩阵中的所有元素。例如,假设我们有如下的4x4矩阵:
顺时针打印的结果应该是:[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
😊数据范围:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
🫡示例1
输入:[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
返回值:[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
🫡 示例2
输入:[[1,2,3,1],[4,5,6,1],[4,5,6,1]]
返回值:[1,2,3,1,1,1,6,5,4,4,5,6]
🥰解题思路
要实现顺时针打印矩阵,我们可以将其看作是逐层打印。具体来说,从矩阵的外层开始,按照顺时针的顺序依次打印出来,然后逐层向内推进,直到矩阵的所有元素都被打印出来。
为了实现这一思路,我们需要使用四个变量来分别标记当前未打印区域的上下左右边界,即 r1
, r2
, c1
, c2
。这些变量分别代表当前矩阵部分的上边界、下边界、左边界和右边界。
打印一层矩阵的步骤如下:
- 从左到右打印当前层的上边界。
- 从上到下打印当前层的右边界。
- 如果上边界和下边界不同,从右到左打印当前层的下边界。
- 如果左边界和右边界不同,从下到上打印当前层的左边界。
每打印完一层矩阵后,更新边界值,逐步缩小打印范围,直到所有元素都被打印为止。
💕代码实现
我们可以用Java语言来实现这一逻辑,代码如下:
public ArrayList<Integer> printMatrix(int[][] matrix) {
ArrayList<Integer> ret = new ArrayList<>();
int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1;
while (r1 <= r2 && c1 <= c2) {
// 从左到右打印上边界
for (int i = c1; i <= c2; i++)
ret.add(matrix[r1][i]);
// 从上到下打印右边界
for (int i = r1 + 1; i <= r2; i++)
ret.add(matrix[i][c2]);
// 从右到左打印下边界
if (r1 != r2)
for (int i = c2 - 1; i >= c1; i--)
ret.add(matrix[r2][i]);
// 从下到上打印左边界
if (c1 != c2)
for (int i = r2 - 1; i > r1; i--)
ret.add(matrix[i][c1]);
// 更新边界,向内收缩一层
r1++; r2--; c1++; c2--;
}
return ret;
}
😊代码解析
r1
,r2
,c1
,c2
分别表示当前未打印部分的上下左右边界。while
循环保证只要还有未打印的部分,就继续执行打印操作。- 每次打印完一层后,通过调整
r1
,r2
,c1
,c2
的值来缩小打印范围,逐步向内推进。 - 需要特别注意的是,当只有一行或一列时,不需要重复打印下边界或左边界,因此要加上条件判断。
😄总结
通过这种逐层打印的方式,我们能够轻松地实现顺时针打印矩阵的功能。这一方法充分利用了矩阵的结构特点,避免了重复打印和漏打的情况,代码逻辑清晰,易于理解。希望这篇文章能够帮助你更好地掌握顺时针打印矩阵的问题及其解法,为你的算法学习之路增添一分助力。
- 点赞
- 收藏
- 关注作者
评论(0)