给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| /** * m行n列,所以矩阵中一共的元素为 m*n * 所以每输除一个元素,总值减- */ public List<Integer> spiralOrder(int[][] matrix) { //行 * 列 得出最大个数 int mCount = matrix.length * matrix[0].length; List<Integer> list = new ArrayList<>(mCount); int i = 0; int j = 0; //行坐标的开始值为0 int startx = 0; //纵坐标的开始值为0 int starty = 0; int loop = 0;//从第一轮开始 //循环的次数必须要同时少于行中点以及纵中点 while (loop < matrix.length / 2 && loop < matrix[0].length / 2) { i = starty; j = startx; loop++;
//从左上到右上 for (; j < matrix[0].length - loop; j++) { list.add(matrix[i][j]); } //右上到右下 for (; i < matrix.length - loop; i++) { list.add(matrix[i][j]); } //右下到左下 for (; j > startx; j--) { list.add(matrix[i][j]); } //左下到左上 for (; i > starty; i--) { list.add(matrix[i][j]); } starty++; startx++; }
if (list.size() != mCount) { if (matrix[0].length / 2 > loop && matrix[0].length != 1) { //从左上到右上 while (matrix[0].length - loop - startx > 0) { list.add(matrix[starty][startx++]); } } else { while (matrix.length - loop - starty > 0) { list.add(matrix[starty++][startx]); } } } return list; }
|