LeetCode 54. 螺旋矩阵(Spiral Matrix) 剑指offer-顺时针打印矩阵
题目描述
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路
首先判断要打印的矩阵外圈左上角元素坐标是否满足条件。通过观察可得,左上角元素的横坐标和纵坐标的两倍应分别小于总行数和总列数,即row*2<rows且col*2<cols。然后判断打印边界情况,可以得到最右边的列索引为cols-col-1,同理最下边的行索引为rows-row-1,考虑按以下顺序打印并检查:
- 从左上角元素开始,打印第一行到最右列;
- 从第二行最右列元素开始,打印最后一列到最下行;
- 若最下边的行索引不与第一行重合,则从最下行的倒数第二列元素开始,打印元素到第一列;
- 若最左边的行索引不与最右边重合,则从第一列的倒数第二行元素开始,打印到第二行停止
代码
1 class Solution { 2 public: 3 vector<int> spiralOrder(vector<vector<int>>& matrix) { 4 vector<int> v; 5 if(matrix.empty()) 6 return v; 7 int rows=matrix.size(),cols=matrix[0].size(); 8 int row=0,col=0; 9 while(row*2<rows&&col*2<cols){ 10 int rl=rows-row-1,cl=cols-col-1; 11 for(int i=col;i<=cl;i++) 12 v.push_back(matrix[row][i]); 13 for(int i=row+1;i<=rl;i++) 14 v.push_back(matrix[i][cl]); 15 if(rl!=row){ 16 for(int i=cl-1;i>=col;i--) 17 v.push_back(matrix[rl][i]); 18 } 19 if(cl!=col){ 20 for(int i=rl-1;i>row;i--) 21 v.push_back(matrix[i][col]); 22 } 23 row++;col++; 24 } 25 return v; 26 } 27 };