题目链接
acwing
leetcode
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
数据范围矩阵中元素数量 [0,400]。
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
解题
用偏移量的思想来做!
- 所以定义偏移量数组
- dx[] = {-1, 0, 1, 0} //dx存x的偏移量
- dy[] = {0, 1, 0, -1} //dy存y的偏移量
- 枚举四个方向的时候,for循环i从0开始枚举到<4
- 求枚举后的新的坐标 a=x+dx[i] b=y+dy[i]
- 什么时候更换方向:当越界或者a,b的下标已经存在值之后 更换方向
代码实现
class Solution {int[] dx = {0, 1, 0, -1};int[] dy = {1, 0, -1, 0};public int[] printMatrix(int[][] matrix) {// 初始方向int d = 0;int xlength = matrix.length;if(xlength == 0) return new int[0];int ylength = matrix[0].length;int[] res = new int[xlength * ylength];boolean[][] visit = new boolean[xlength][ylength];int x = 0, y = 0;for(int i = 0; i < xlength*ylength; i ++){visit[x][y] = true;res[i] = matrix[x][y];int xNext = x + dx[d];int yNext = y + dy[d];if(xNext < 0 || xNext >= xlength || yNext < 0 || yNext >= ylength || visit[xNext][yNext]){d = (d + 1) % 4;xNext = x + dx[d];yNext = y + dy[d];}x = xNext;y = yNext;}return res;}
}