给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
image.png
【思路】
确定一个前进方向,如果碰到矩阵边界,或者已经搜索的的位置则顺时针变换方向。
- 需要另建一个矩阵去记录走过的位置
- 如何实现顺时针旋转?
建立一个方向的向量 四个方向 依次往下 详见代码 - 代码用while 何时推出循环?
当换了个方向仍是搜索过的时候 就退出
【坑】
考虑特殊情况 只有一个数字的矩阵,唯一的位置是(0,0)
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<vector<int>> record(matrix.size(), vector<int>(matrix[0].size(), 0));
vector<int> res;
int i = 0;
int j = 0;
vector<int> dirJ = { 1,0,-1,0 };
vector<int> dirI = { 0,1,0,-1 };
int dir = 0;
int flagI = dirI[dir];
int flagJ = dirJ[dir];
while (true) {
if (j<0 || j>= matrix[0].size() || i<0 || i>= matrix.size() || record[i][j] == 1) { //顺时针旋转方向
i = i - dirI[dir];
j = j - dirJ[dir];
dir = (dir + 1) % 4;
i = i + dirI[dir];
j = j + dirJ[dir];
//这个判断条件也要判断是否出界,只有0,0的特殊情况
if (j < 0 || j >= matrix[0].size() || i < 0 || i >= matrix.size() || record[i][j] == 1) break;
continue;
}
res.push_back(matrix[i][j]);
record[i][j] = 1;
i = i + dirI[dir];
j = j + dirJ[dir];
}
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
return res;
}
网友评论