- 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
思路:从外向内,顺时针遍历,每条边始终保持“左闭右开”。最内一层不是环状时需单独处理。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ret;
int h = matrix.size();
int w = matrix[0].size();
int n = w < h ? w : h;
int layers = n / 2; // 层数用宽、高小的指来取
int l = 0;
int startx = 0, starty = 0;
int i = 0, j = 0;
int offset = 1; // 左闭右开,除去最后边位置
while (l < layers) { // 层数为奇数时,最内一层先不作处理
for (j = starty; j < starty + w - offset; j++) {
ret.push_back(matrix[startx][j]);
}
for (i = startx; i < startx + h - offset; i++) {
ret.push_back(matrix[i][j]);
}
for(; j > starty; j--) { // j的位置保持上一次结束的位置不变
ret.push_back(matrix[i][j]);
}
for(; i > startx; i--){// i的位置保持上一次结束的位置不变
ret.push_back(matrix[i][j]);
}
offset += 2; // 每向内一层,每行/列少两个元素
startx++; // 起始位置更新
starty++;
l++;
}
// 层数为奇数时,处理最内一层
if(h > w && ((w % 2) == 1)) { // 最内一层只有一列,从上到下一次读取
for(i = startx; i < startx + h - offset + 1; i++){ // +1:offser初始化为1(作左闭右开没有包含最右边位置)
ret.push_back(matrix[i][starty]);
}
}else if(h < w && ((h % 2) == 1)){ // 最内一层只有一行,,从左往右一次读取
for(j = startx; j < starty + w - offset + 1; j++){
ret.push_back(matrix[startx][j]);
}
}else if((w == h) && ((n % 2) == 1)) // 行列相等,且为奇数时,获取最中间的位置
ret.push_back(matrix[startx][starty]);
return ret;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix