TypeScript実装の詳細解析
上の行を左から右へ埋める
右の列を上から下へ埋める
下の行を右から左へ埋める
左の列を下から上へ、中央を埋める
/**
* 螺旋状にn×nマトリックスを1からn²まで埋める関数
* @param n - マトリックスのサイズ (1 <= n <= 20)
* @returns 螺旋状に埋められたn×nマトリックス
*/
function generateMatrix(n: number): number[][] {
// n×nマトリックスを0で初期化
const matrix: number[][] = Array(n).fill(null).map(() => Array(n).fill(0));
let top: number = 0, bottom: number = n - 1, left: number = 0, right: number = n - 1;
let num: number = 1;
while (top <= bottom && left <= right) {
// 上の行を左から右へ
for (let col: number = left; col <= right; col++) {
matrix[top][col] = num++;
}
top++;
// 右の列を上から下へ
for (let row: number = top; row <= bottom; row++) {
matrix[row][right] = num++;
}
right--;
// 下の行を右から左へ(行が残っている場合)
if (top <= bottom) {
for (let col: number = right; col >= left; col--) {
matrix[bottom][col] = num++;
}
bottom--;
}
// 左の列を下から上へ(列が残っている場合)
if (left <= right) {
for (let row: number = bottom; row >= top; row--) {
matrix[row][left] = num++;
}
left++;
}
}
return matrix;
}
export { generateMatrix };
• 外側ループ: 最大 ⌈n/2⌉ 回
• 内側ループ: 各境界に沿って移動
• 総訪問回数: n² 回(すべての要素)
• 結果マトリックス: n² 要素
• 追加変数: O(1) (境界変数のみ)
• 最適化: 不要な配列生成を回避
// 上の行を左から右へ
for (let col: number = left; col <= right; col++) {
matrix[top][col] = num++;
}
top++;
処理内容:
// 右の列を上から下へ
for (let row: number = top; row <= bottom; row++) {
matrix[row][right] = num++;
}
right--;
処理内容:
if (top <= bottom) {
for (let col: number = right; col >= left; col--) {
matrix[bottom][col] = num++;
}
bottom--;
}
処理内容:
if (left <= right) {
for (let row: number = bottom; row >= top; row--) {
matrix[row][left] = num++;
}
left++;
}
処理内容:
Array.fill(null)で型安全な初期化