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 };

 

posted @ 2018-05-06 19:17  FlyingWarrior  阅读(397)  评论(0编辑  收藏  举报