Given a positive integer
n
, generate ann x n
matrix
filled with elements from1
ton2
in spiral order.
給定一個整路n
,以迴旋方式產生一個陣列,並將數字從1
填充到n2
題目要求以迴旋方式將數字填入到矩陣中,因此我們需要考慮每一個邊,該如何設計迴圈的操作條件,依舊是要堅持迴圈不變量的原則,填充的順序為
首先決定這樣的操作會循環幾次,如果n
是奇數則只要做n / 2
次,中間元素最後處理就好,如果是偶數次也是做n / 2
次。
接著設計起始位置與終止位置,作為4個邊循環的條件,每次繞完後將起始位置加一,終止位置減一,代表著向內部進行縮圈,在這次實作中保持左必右開的循環原則
loop
變數作為每繞外圈的次數start_x
與start_y
作為起始位置的索引end_x
與end_y
作為終止位置count
作為元素計數start_x
固定,沿著y
軸循環元素end_y
固定,沿著x
軸循環元素end_x
固定,反方向沿著y
軸循環元素start_y
固定,沿著x軸循環元素class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n, 0));
int loop = n / 2;
int start_x = 0;
int start_y = 0;
int end_x = n - 1;
int end_y = n - 1;
int count = 1;
while(loop) {
for (int i = start_x; i < end_x; i++){
ans[start_y][i] = count++;
}
for (int i = start_y; i < end_y; i++){
ans[i][end_x] = count++;
}
for (int i = end_x; i > start_x; i--){
ans[end_y][i] = count++;
}
for (int i = end_y; i > start_y; i--){
ans[i][start_x] = count++;
}
start_x++;
start_y++;
end_x--;
end_y--;
loop--;
}
if (n % 2 == 1){
ans[n / 2][n / 2] = count;
}
return ans;
}
};