トピックリンク: 59. スパイラルマトリックス II
ゼロ、説明
正の整数 n を指定すると、1 ~ n 2 n^2を含む配列を生成します。n2すべての要素と、要素が時計回りに螺旋状に配置された nxn 正方行列行列
例:
例 1:
入力: n = 3
出力: [[1,2,3],[8,9,4],[7,6,5]]
例 2:
入力: n = 1
出力: [[1]]
1. 解決策: シミュレーション
シミュレーション行列の生成。
初期位置はマトリックスの左上隅に設定され、初期方向は右に設定されます。
次のステップの位置がマトリックスの境界を超える場合、または以前に訪問した位置である場合は、時計回りに回転して次の方向に入ります。n 2 n^2が埋まるまでこれを繰り返しますn2つの要素。
鍵:循環する論理
- 2次元配列を作成する
vector<vector<int>> res(n,vector<int>(n));
- 時計回りの順序で、最初に行数を (上、左) から (上、右) に固定します。
- 次に、列数を (上+1、右) から (下、右) に修正します [注: 上には +1 が必要です]
- 次に、行数を (bottom, right-1) から (bottom, left) に修正します。
- 次に、列数を (bottom-1, left) から (top+1, left) に修正します [注: この時点では、上が top+1 であるため、到着は top+1 になります]
- ラップを完了する
- この時点では (top+1, left) となっており、次のサイクルの開始点ではなく、left+1 であることに注意してください。
- 開始点は (上+1、左+1) です。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n));
int up = 0, down = n - 1, left = 0, right = n - 1, index = 1;
while(index <= n * n){
for(int i = left; i <= right; i++){
res[up][i] = index++;
}
up++;
for(int i = up; i <= down; i++){
res[i][right] = index++;
}
right--;
for(int i = right; i >= left; i--){
res[down][i] = index++;
}
down--;
for(int i = down; i >= up; i--){
res[i][left] = index++;
}
left++;
}
return res;
}
};