螺旋矩阵
- 题解1 循环(4个标志——根据顺时针)
- 题解2 方向
给你一个
m
行
n
列的矩阵
matrix
,请按照
顺时针螺旋顺序 ,返回矩阵中的所有元素。
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
题解1 循环(4个标志——根据顺时针)
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
const int row = matrix.size();
const int column = matrix[0].size();
vector<int> res;
int i(0), j (0), startR(0), endR(column-1), startC(0), endC(row-1);
while(startC <= endC){
i = startC;
j = startR;
if(j <= endR){
while(j <= endR)
// i = startC
res.push_back(matrix[i][j++]);
startC ++;
i ++;
}else break;
if(i <= endC){
j = endR;
while(i <= endC)
// j = endR
res.push_back(matrix[i++][j]);
endR --;
j --;
}else break;
if(j >= startR){
i = endC;
while(j >= startR)
// i = endC
res.push_back(matrix[i][j--]);
endC --;
i --;
}else break;
if(i >= startC){
j = startR;
while(i >= startC)
// j = startR
res.push_back(matrix[i--][j]);
startR ++;
}else break;
}
return res;
}
};
题解2 方向
class Solution {
private:
// 向右、向下、向左、向上
static constexpr int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return {};
}
int rows = matrix.size(), columns = matrix[0].size();
vector<vector<bool>> visited(rows, vector<bool>(columns));
int total = rows * columns;
vector<int> order(total);
int row = 0, column = 0;
int directionIndex = 0;
// 终止条件是 元素数目
for (int i = 0; i < total; i++) {
order[i] = matrix[row][column];
visited[row][column] = true;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
directionIndex = (directionIndex + 1) % 4;
}
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return order;
}
};