题目地址(29. 顺时针打印矩阵)
https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/
同螺旋矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入: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]限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 100注意:本题与主站 54 题相同:https://leetcode-cn.com/problems/spiral-matrix/
前置知识
公司
- 暂无
思路

我采用的是不遍历到底的方法 定义好左右上下边界 每遍历一层 就往里缩一圈 直到剩下最后一行或一列 再单独处理
关键点
- 矩阵不一定是方阵
top < bottom && left < right 是循环的条件
无法构成“环”了,就退出循环,退出时可能是这 3 种情况之一:
top == bottom && left < right —— 剩一行
top < bottom && left == right —— 剩一列
top == bottom && left == right —— 剩一项(也算 一行/列)
代码
- 语言支持:Java
Java Code:
class Solution {public int[] spiralOrder(int[][] matrix) {//如果矩阵为空 返回空if (matrix.length == 0) return new int[0];//数组大小为矩阵长乘宽int[] res = new int[matrix.length * matrix[0].length];//定义边界int zuo = 0;int you = matrix[0].length-1;int shang = 0;int xia = matrix.length-1;//res每次插入的下标int index =0 ;//左右上下都满足的情况 继续循环 有一边不满足继续下面的判断while (zuo < you && shang < xia) {//依次是左到右 上到下 右到左 下到上for (int i = zuo; i <you ; i++) res[index++] = matrix[shang][i];for (int i = shang; i < xia ; i++) res[index++] = matrix[i][you];for (int i = you; i > zuo ; i--) res[index++] = matrix[xia][i];for (int i = xia; i > shang ; i--) res[index++] = matrix[i][zuo];//矩阵向内缩一层zuo++;you--;shang++;xia--;}//剩下的是一列 从上到下加入数组if (zuo == you) {for (int i = shang; i <=xia ; i++) {res[index++] = matrix[i][you];}}//剩下的是一行 一定是else ifelse if (shang == xia) {for (int i = zuo; i <=you ; i++) {res[index++] = matrix[shang][i];}}return res;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=geve5)
- 空间复杂度:
#card=math&code=O%28n%29&id=KBiR3)
