剑指 Offer 29. 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
代码:
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0) return new int[0];
// l 左 r 右 t 上 b 下
int l = 0,r = matrix[0].length - 1, t = 0, b = matrix.length - 1,x = 0;
int [] res = new int [(r + 1) * (b + 1)];
while (true){
for (int i = 1; i<=r ;i++)
res[x++] = matrix[t][i]; //左到右
if ( ++t > b)
break;
for (int i = t; i <= b; i++)
res[x++] = matrix[i][r]; //从上到下
if (l > --r)
break;
for (int i = r; i >= l;i--)
res[x++] = matrix[b][i]; //右到左
if (t > --b)
break;
for (int i = b; i>= t;i--)
res[x++] = matrix[i][l]; //下到上
if (++l > r)
break;
}
return res;
}
}
另一种思路:
打印外框

判断左上角的点和右下角的点别错过去就行

public class PrintMatrixSpiralOrder {
public static void spiralOrderPrint(int[][] matrix) {
int tR = 0;
int tC = 0;
int dR = matrix.length - 1;
int dC = matrix[0].length - 1;
//左上角的行小于等于右下角的行 左上角的列小于等于左下角的列
while (tR <= dR && tC <= dC) {
printEdge(matrix, tR++, tC++, dR--, dC--); // 每次打印完都把左上角的坐标往右下角移动,右下角的坐标往左上角移动
}
}
// int tR 左上角点的行, int tC 左上角点的列, int dR 右下角点的行, int dC 右下角点的列
public static void printEdge(int[][] m, int tR, int tC, int dR, int dC) {
//左上角的行和右下角的行在同一行 即 o————o横向结构
if (tR == dR) {
//把列进行相加
for (int i = tC; i <= dC; i++) {
System.out.print(m[tR][i] + " ");
}
}
// 左上角的列和右下角的列在同一列 纵向结构
/*
o
|
|
o
*/
else if (tC == dC) {
//把行进行相加
for (int i = tR; i <= dR; i++) {
System.out.print(m[i][tC] + " ");
}
} else {
int curC = tC;
int curR = tR;
while (curC != dC) {
System.out.print(m[tR][curC] + " ");
curC++;
}
while (curR != dR) {
System.out.print(m[curR][dC] + " ");
curR++;
}
while (curC != tC) {
System.out.print(m[dR][curC] + " ");
curC--;
}
while (curR != tR) {
System.out.print(m[curR][tC] + " ");
curR--;
}
}
}
public static void main(String[] args) {
int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
spiralOrderPrint(matrix);
}
}

浙公网安备 33010602011771号