- 模拟题,注意越界啊!
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> >& matrix) {
// 简单模拟
int m = matrix.size(); // 行
vector<int> C;
if (m == 0) return C;
int n = matrix[0].size();// 列
int sum = m * n; // 总的元素个数
// 右 下 左 上 螺旋走 四个边界
int right = n - 1;
int down = m - 1;
int left = 0;
int up = 0;
int i = 0; // 存储数组的量
int idx = 0; // 当前走到的矩阵元素
// 记得每次要刷新一下边界,因为存完之后,会减少
while (1) {
// 四个方向如何走
// 从左往右走
for (idx = left; idx <= right; idx++) {
C.push_back(matrix[up][idx]);
i++;
}
up++;
if (i >= sum) break; // 若是超过总的个数,就停止了
// 从上往下走
for (idx = up; idx <= down; idx++) {
C.push_back(matrix[idx][right]);
i++;
}
right--;
if (i >= sum) break; // 若是超过总的个数,就停止了
// 从右向左走
for (idx = right; idx >= left; idx--) {
C.push_back(matrix[down][idx]);
i++;
}
down--;
if (i >= sum) break; // 若是超过总的个数,就停止了
// 从下往上走
for (idx = down; idx >= up; idx--) {
C.push_back(matrix[idx][left]);
i++;
}
left++;
if (i >= sum) break; // 若是超过总的个数,就停止了
}
return C;
}
};