这题不简单,考察想象力和对边界的把控,最好是结合图来推理,感觉第一次做很难完美做出来。注意区间要遵循 左闭右开 原则,虽然 左闭右开、左开右闭、左闭右闭、左开右开 进行合适的组合也能做出来,但是不好。
这次是我代码写得最美的一次
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int start_x = 0, start_y = 0, circle = 1, debuff = 1, count = 1;
while (circle <= n / 2) {
for (int i = start_x, j = start_y; j < n - debuff; ++j) {
result[i][j] = count++;
}
for (int i = start_x, j = n - debuff; i < n - debuff; ++i) {
result[i][j] = count++;
}
for (int i = n - debuff, j = n - debuff; j > start_y; --j) {
result[i][j] = count++;
}
for (int i = n - debuff, j = start_y; i > start_x; --i) {
result[i][j] = count++;
}
++start_x, ++start_y; ++circle; ++debuff;
}
if (n % 2 != 0) result[n / 2][n / 2] = n * n;
return result;
}
};