描述
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
数据范围:0 \le n,m \le 100≤n,m≤10,矩阵中任意元素都满足 |val| \le 100∣val∣≤100
要求:空间复杂度 O(nm)O(nm) ,时间复杂度 O(nm)O(nm)
示例
输入:[[1,2,3],[4,5,6],[7,8,9]]
返回值:[1,2,3,6,9,8,7,4,5]
思路:
顺时针返回矩阵的所有元素,可以从外到内的顺时针方式返回矩阵的所有元素,依次从左到右从上到下…的顺序输出,一圈之后,让top和left都加一,从第二行第二列开始输出。
代码:
// A code block
var foo = 'bar';
// An highlighted block
//
// Created by jt on 2020/9/29.
//
#include <vector>
using namespace std;
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
if (matrix.empty()) return res;
int top = 0, bottom = matrix.size() - 1;
int left = 0, right = matrix[0].size() - 1;
while (top < (matrix.size()+1) / 2 && left < (matrix[0].size()+1) / 2) {
// 上
for (int i = left; i <= right; ++i) {
res.push_back(matrix[top][i]);
}
// 右
for (int i = top + 1; i <= bottom; ++i) {
res.push_back(matrix[i][right]);
}
// 下
for (int i = right - 1; i >= left; --i) {
res.push_back(matrix[bottom][i]);
}
// 左
for (int i = bottom - 1; i >= top + 1; --i) {
res.push_back(matrix[i][left]);
}
++top, --bottom, ++left, --right;
}
return res;
}
};