题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 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.
四个方向,一圈一圈分别处理;最后处理单行,单列的情况
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
| public ArrayList<Integer> printMatrix(int[][] matrix) { ArrayList<Integer> ans = new ArrayList<>(); int row = matrix.length, col = matrix[0].length;
int circle = 0; int stepCol = col - 1, stepRow = row - 1;
while (col - circle * 2 > 1 && row - circle * 2 > 1) { int start1 = circle; for (int i = start1; i < stepCol + start1; i++) { ans.add(matrix[circle][i]); } int start2 = circle; for (int j = start2; j < stepRow + start2; j++) { ans.add(matrix[j][col - circle - 1]); } int start3 = col - circle - 1; for (int i = start3; i > start3 - stepCol; i--) { ans.add(matrix[row - circle - 1][i]); } int start4 = row - circle - 1; for (int j = start4; j > start4 - stepRow; j--) { ans.add(matrix[j][circle]); } stepCol -= 2; stepRow -= 2; circle++; } if (row - circle * 2 == 1 && col - circle * 2 == 1) { ans.add(matrix[row / 2][col / 2]); } else { if (col - circle * 2 == 1) { for (int i = circle; i < row - circle; i++) { ans.add(matrix[i][col / 2]); } } if (row - circle * 2 == 1) { for (int j = circle; j < col - circle; j++) { ans.add(matrix[row / 2][j]); } } }
return ans; }
|
网上题解
链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?answerType=1&f=discussion
来源:牛客网
1. 分析
刷 LeetCode 看到的大神题解,感觉容易理解且好写
简单来说,就是不断地收缩矩阵的边界
定义四个变量代表范围,up、down、left、right
- 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
- 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
- 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
- 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错
2. 代码
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 56
| import java.util.ArrayList; public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> list = new ArrayList<>(); if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ return list; } int up = 0; int down = matrix.length-1; int left = 0; int right = matrix[0].length-1; while(true){ for(int col=left;col<=right;col++){ list.add(matrix[up][col]); } up++; if(up > down){ break; } for(int row=up;row<=down;row++){ list.add(matrix[row][right]); } right--; if(left > right){ break; } for(int col=right;col>=left;col--){ list.add(matrix[down][col]); } down--; if(up > down){ break; } for(int row=down;row>=up;row--){ list.add(matrix[row][left]); } left++; if(left > right){ break; } } return list; } }
|
3. 复杂度
时间复杂度:&preview=true)
空间复杂度:&preview=true)