题目描述:
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
题目分析:
本题主要考察二维矩阵的边界检查,简单遍历即可
第一思路:给定上下左右四个方向,依次进行循环,每个方向遍历结束则改变方向,同时该方向上大小减1
// 使用一个二维数据来规定四个方向
int dir[4][2] = {
{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int step[2] = {0};
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(!matrix.size()){
return res;
}
step[1] = matrix.size()-1;
if(!matrix[0].size()){
return res;
}
step[0] = matrix[0].size();
int dir_idx = 0;
int cur[2] = {0, -1};
int flag = dir_idx % 2;
while(step[flag]){
for(int i =0; i<step[flag]; i++){
cur[0] = cur[0] + dir[dir_idx][0];
cur[1] = cur[1] + dir[dir_idx][1];
res.push_back(matrix[cur[0]][cur[1]]);
}
step[flag]--;
dir_idx = (dir_idx + 1) % 4;
flag = dir_idx % 2;
}
return res;
}
优化实现:只需要对四个方向的最大值边界进行动态维护,即可快速进行螺旋遍历,当边界冲突退出
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if (matrix.empty()) return res;
int up = 0, down = matrix.size() -1;
int left = 0, right = matrix[0].size()-1;
while(true){
// 最上一行,从左往右
for(int i = left; i<=right; i++) res.push_back(matrix[up][i]);
if(++up > down) break;
// 最右一行,从上往下
for(int i = up; i<=down; i++) res.push_back(matrix[i][right]);
if(--right < left) break;
// 最下一行,从右往左
for(int i = right; i>= left; i--) res.push_back(matrix[down][i]);
if(--down < up) break;
// 最左一行,从下往上
for(int i = down; i>= up; i--) res.push_back(matrix[i][left]);
if(++left > right) break;
}
return res;
}