题目描述:
Given an integer n, generate a square matrix filled with elements from 1 to n^2 in spiral order.
Notice
Example
题目思路:
Given n = 3
,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
这题的思路在于不断缩小上下左右的boundary,而不用每次都计算position这么复杂。需要注意的是,循环终止的条件不是转完一圈才退出,一旦检测到count达到了n*n,就可以break。
Mycode(AC = 29ms):
class Solution {
public:
/**
* @param n an integer
* @return a square matrix
*/
vector<vector<int>> generateMatrix(int n) {
// Write your code here
vector<vector<int>> sp_matrix(n, vector<int>(n, 0));
int count = 1,
upper_row = 0,
down_row = n - 1,
left_col = 0,
right_col = n - 1;
while (count <= n * n) {
// fill in upper row
for (int i = left_col; i <= right_col; i++) {
sp_matrix[upper_row][i] = count++;
}
upper_row++;
if (count > n * n) break;
// fill in right col
for (int i = upper_row; i <= down_row; i++) {
sp_matrix[i][right_col] = count++;
}
right_col--;
if (count > n * n) break;
// fill in down row
for (int i = right_col; i >= left_col; i--) {
sp_matrix[down_row][i] = count++;
}
down_row--;
if (count > n * n) break;
// fill in left col
for (int i = down_row; i >= upper_row; i--) {
sp_matrix[i][left_col] = count++;
}
left_col++;
}
return sp_matrix;
}
};