思考:螺旋遍历可以直接模拟
需要注意 1、四个方向每个方向走几步,步数逐次减一。 2、每个方向走完后,需要调整到新起点。 3、用位置不太好作为终止条件,用计数做终止条件,每次走完可能终止。
输入:[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int nrow;
int ncol;
int n;
nrow = matrix.size();
if (nrow == 0) return res;
ncol = matrix[0].size();
n = nrow * ncol;
int x = 0, y = 0;
while(n != 0) {
// >
for (int i = 0; i < ncol; i++) {
printf("(>)%d ", matrix[x][y]);
res.push_back(matrix[x][y++]);
n--;
}
if (n == 0) break;
x += 1;
y--;
nrow -= 1;
printf("\nnew [%d,%d] row:%d n:%d\n",x, y, nrow, n);
// v
for (int i = 0; i < nrow; i++) {
printf("(v)%d ", matrix[x][y]);
res.push_back(matrix[x++][y]);
n--;
}
if (n == 0) break;
x--;
y -= 1;
ncol -= 1;
printf("\nnew [%d,%d] col:%d n:%d\n",x, y, ncol, n);
// <
for (int i = 0; i < ncol; i++) {
printf("(<)%d ", matrix[x][y]);
res.push_back(matrix[x][y--]);
n--;
}
if (n == 0) break;
x -= 1;
y++;
nrow -=1;
printf("\nnew [%d,%d] row:%d n:%d\n",x, y, nrow, n);
// ^
for (int i = 0; i < nrow; i++) {
printf("(^)%d ", matrix[x][y]);
res.push_back(matrix[x--][y]);
n--;
}
if (n == 0) break;
x++;
y += 1;
ncol -= 1;
printf("\nnew [%d,%d] col:%d n:%d\n",x, y, ncol, n);
}
return res;
}
输出:
(>)1 (>)2 (>)3 (>)4
new [1,3] row:2 n:8
(v)8 (v)12
new [2,2] col:3 n:6
(<)11 (<)10 (<)9
new [1,0] row:1 n:3
(^)5
new [1,1] col:2 n:2
(>)6 (>)7
new [2,2] row:0 n:0