思路
由外向内螺旋的时候都只操作最外圈的元素,因此可以每次循环处理一圈元素,然后把边界缩小,直到边界越界(即左边界在右边界的右边)
代码
class Solution {
public:
int num = 1;
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix(n, vector<int>(n));
// 每次绕圈时的边界
int left = 0, right = n - 1, top = 0, bottom = n - 1;
// 用于访问数组元素
int i, j;
// 如果写left < right就会错误处理n=1的输入
while (left <= right) {
i = top; j = left;
if (left == right) {
matrix[i][j] = num;
break;
}
// 左闭右开,即每行/列的最后一个元素交给下一列/行处理
while (j < right)
matrix[i][j++] = num++;
while (i < bottom)
matrix[i++][j] = num++;
while (j > left)
matrix[i][j--] = num++;
while (i > top)
matrix[i--][j] = num++;
left++; right--; top++; bottom--;
}
return matrix;
}
};