最直观的思路,想象自己站在棋盘上来螺旋前进,碰壁后回退一步并旋转方向
螺旋矩阵
http://www.nowcoder.com/questionTerminal/7edf70f2d29c4b599693dc3aaeea1d31
时间复杂度O(N), 空间复杂度O(N)
需要记录每个数据是否被访问,记录已经访问的数据个数
想象自己站在棋盘上来螺旋前进,每次碰壁后回退一步并调整方向即向右旋转90°,直到所有数据访问完毕
class Solution {
vector<vector<int>> dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
int m = matrix.size();
if(m == 0) return {};
int n = matrix[0].size();
if(n == 0) return {};
vector<vector<int>> visited(m, vector<int>(n));
int cnt = m * n;
vector<int> ret;
int x = 0, y = -1, i = 0;
while(cnt) {
x += dir[i][0];
y += dir[i][1];
if(x < 0 || x >= m || y < 0 || y >= n || visited[x][y]) {
x -= dir[i][0];
y -= dir[i][1];
i = ++i % 4;
}
else {
--cnt;
ret.push_back(matrix[x][y]);
visited[x][y] = 1;
}
}
return ret;
}
};
OPPO公司福利 1126人发布