スパイラルマトリックス (2)
分析:
レイヤーごとのシミュレーション
マトリックスはいくつかのレイヤーと見なすことができます。最初にマトリックスの最も外側の要素を埋め、次にマトリックスの 2 番目の外側の要素を埋め、マトリックスの最も内側の要素が満たされるまで続けます。
レイヤーごとに、左上から時計回りにすべての要素を埋めていきます。
現在のレイヤーの左上隅が (上、左) であり、右下隅が (下、右) であると仮定すると、現在のレイヤーの要素を次の順序で塗りつぶします。
- 上部の要素を左から右へ、(上、左) から (上、右) の順序で埋めます。
- 右側の要素を上から下に、(上 + 1、右) から (下、右) に入力します。
- 下の要素を右から左に、(下、右 - 1) から (下、左) に入力します。
- 左側の要素を下から上に (下 - 1、左) から (上 + 1、左) に入力します。
現在のレイヤーのすべての要素を塗りつぶした後、左と上をそれぞれ 1 増やし、右と下をそれぞれ 1 減らし、次のレイヤーに入り、すべての要素が塗りつぶされるまで要素を塗りつぶし続けます。
コード
class Solution {
public int[][] generateMatrix(int n) {
int num = 1;
int[][] matrix = new int[n][n];
int top = 0, right = n - 1, bottom = n - 1, left = 0;
while(left <= right && top <= bottom) {
for(int col = top; col <= right; col++) {
matrix[top][col] = num;
num++;
}
for(int row = top + 1; row <= bottom; row++) {
matrix[row][right] = num;
num++;
}
for(int col = right - 1; col >= top; col--) {
matrix[bottom][col] = num;
num++;
}
for(int row = bottom - 1; row > top; row--) {
matrix[row][left] = num;
num++;
}
top++;
right--;
bottom--;
left++;
}
return matrix;
}
}