剑指 Offer 29. 顺时针打印矩阵

剑指 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);

	}

}

posted @ 2021-01-02 21:26  your_棒棒糖  阅读(33)  评论(0)    收藏  举报