题目地址(29. 顺时针打印矩阵)

https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/
同螺旋矩阵

题目描述

  1. 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
  2. 示例 1
  3. 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
  4. 输出:[1,2,3,6,9,8,7,4,5]
  5. 示例 2
  6. 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  7. 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
  8. 限制:
  9. 0 <= matrix.length <= 100
  10. 0 <= matrix[i].length <= 100
  11. 注意:本题与主站 54 题相同:https://leetcode-cn.com/problems/spiral-matrix/

前置知识


公司

  • 暂无

思路

image.png
我采用的是不遍历到底的方法 定义好左右上下边界 每遍历一层 就往里缩一圈 直到剩下最后一行或一列 再单独处理

关键点

  • 矩阵不一定是方阵

top < bottom && left < right 是循环的条件
无法构成“环”了,就退出循环,退出时可能是这 3 种情况之一:
top == bottom && left < right —— 剩一行
top < bottom && left == right —— 剩一列
top == bottom && left == right —— 剩一项(也算 一行/列)

代码

  • 语言支持:Java

Java Code:

  1. class Solution {
  2. public int[] spiralOrder(int[][] matrix) {
  3. //如果矩阵为空 返回空
  4. if (matrix.length == 0) return new int[0];
  5. //数组大小为矩阵长乘宽
  6. int[] res = new int[matrix.length * matrix[0].length];
  7. //定义边界
  8. int zuo = 0;
  9. int you = matrix[0].length-1;
  10. int shang = 0;
  11. int xia = matrix.length-1;
  12. //res每次插入的下标
  13. int index =0 ;
  14. //左右上下都满足的情况 继续循环 有一边不满足继续下面的判断
  15. while (zuo < you && shang < xia) {
  16. //依次是左到右 上到下 右到左 下到上
  17. for (int i = zuo; i <you ; i++) res[index++] = matrix[shang][i];
  18. for (int i = shang; i < xia ; i++) res[index++] = matrix[i][you];
  19. for (int i = you; i > zuo ; i--) res[index++] = matrix[xia][i];
  20. for (int i = xia; i > shang ; i--) res[index++] = matrix[i][zuo];
  21. //矩阵向内缩一层
  22. zuo++;
  23. you--;
  24. shang++;
  25. xia--;
  26. }
  27. //剩下的是一列 从上到下加入数组
  28. if (zuo == you) {
  29. for (int i = shang; i <=xia ; i++) {
  30. res[index++] = matrix[i][you];
  31. }
  32. }//剩下的是一行 一定是else if
  33. else if (shang == xia) {
  34. for (int i = zuo; i <=you ; i++) {
  35. res[index++] = matrix[shang][i];
  36. }
  37. }
  38. return res;
  39. }
  40. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:剑指 Offer 29. 顺时针打印矩阵 - 图2#card=math&code=O%28n%29&id=geve5)
  • 空间复杂度:剑指 Offer 29. 顺时针打印矩阵 - 图3#card=math&code=O%28n%29&id=KBiR3)