【算法】顺时针打印矩阵
顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字,例如,如果输入如下4*4矩阵:
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。
解题思路
- 因为一个二维平面,给定两个坐标(x1, y1)和(x2, y2)可以唯一确定一个矩阵。
- 然后可以通过圈子来打印对应的矩阵,然后缩小圈子完成整个过程即可。
图解过程
这个时候就打印出了1,2,3,4,8,12,16,15,14,13,9,5。
然后这个时候缩小圈子继续重复:
这个时候继续打印出6,7,11,10。然后全部拼接起来就是答案了。
X代表纵行,纵坐标, ,Y代表横行 切记
代码
import java.util.ArrayList; /** * @author god-jiang * @date 2020/1/17 20:58 */ public class Solution { static ArrayList<Integer> resList = new ArrayList<>(); public static ArrayList<Integer> printMatrix(int[][] matrix) { //拿到左上角(x1, y1)和右下角(x2, y2) int x1 = 0; int y1 = 0; int x2 = matrix.length - 1; int y2 = matrix[0].length - 1; //顺时针打印圈子的数值 while (x1 <= x2 && y1 <= y2) { helpPrintMatrix(matrix, x1++, y1++, x2--, y2--); } return resList; } public static void helpPrintMatrix(int[][] matrix, int x1, int y1, int x2, int y2) { if (x1 == x2) { for (int i = y1; i <= y2; i++) { resList.add(matrix[x1][i]); } } else if (y1 == y2) { for (int i = x1; i <= x2; i++) { resList.add(matrix[i][y1]); } //知道(x1, y1)和(x2, y2)可以确定一个矩阵 } else { int curX = x1; int curY = y1; while (curY != y2) { resList.add(matrix[x1][curY]); curY++; } while (curX != x2) { resList.add(matrix[curX][y2]); curX++; } while (curY != y1) { resList.add(matrix[x2][curY]); curY--; } while (curX != x1) { resList.add(matrix[curX][y1]); curX--; } } } }
我只是偶尔安静下来,对过去的种种思忖一番。那些曾经的旧时光里即便有过天真愚钝,也不值得谴责。毕竟,往后的日子,还很长。不断鼓励自己,
天一亮,又是崭新的起点,又是未知的征程(上校9)
逆水行舟,不进,则退!