19. 顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路:
链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?answerType=1&f=discussion
定义四个变量代表范围,up、down、left、right
1. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
2. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
3. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
4. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错
1 import java.util.ArrayList; 2 public class Solution { 3 public ArrayList<Integer> printMatrix(int [][] matrix) { 4 // 判断矩阵是否为空 5 ArrayList<Integer> list = new ArrayList<>(); 6 int up = 0, down = matrix.length - 1; 7 int left = 0, right = matrix[0].length - 1; 8 if(matrix == null || down < 0 || left < 0){ 9 return list; 10 } 11 12 // 四个方向遍历矩阵, 动态更新四个边界值 13 int col, row; 14 while(true){ 15 // 最上面这行向右 16 for(col = left; col <= right; col++){ 17 list.add(matrix[up][col]); 18 } 19 up++; // 更新上边界 20 if(down < up){ 21 break; 22 } 23 // 最右边这行向下 24 for(row = up; row <= down; row++){ 25 list.add(matrix[row][right]); 26 } 27 right--; // 更新右边界 28 if(left > right){ 29 break; // 如果越界则跳出循环 30 } 31 // 最下面这行向左 32 for(col = right; col >= left; col--){ 33 list.add(matrix[down][col]); 34 } 35 down--; // 更新下边界 36 if(up > down){ 37 break; // 如果越界则跳出循环 38 } 39 // 最左边这行向上 40 for(row = down; row >= up; row--){ 41 list.add(matrix[row][left]); 42 } 43 left++; // 更新左边界 44 if(left > right){ 45 break; 46 } 47 } 48 return list; 49 } 50 }
leetcode运行时间为1ms - 96.82%, 空间为40.2MB - 37.45%
复杂度分析:
时间复杂度:遍历了整个矩阵,所以时间复杂度为O(rows*cols)
空间复杂度:除了存储结果的矩阵,其他的空间都是常量级的,所以空间复杂度为O(1)