59. スパイラルマトリックスⅡ
正の整数nを指定すると、1からn 2 n^2までの要素で満たされたnxn 行列を生成します。n2スパイラル順に。
例 1:
入力: n = 3
出力: [[1,2,3],[8,9,4],[7,6,5]]
例 2:
入力: n = 1
出力: [[1]]
制約:
- 1 <= n <= 20
From: LeetCode
Link: 59. スパイラル マトリックス II
解決:
アイデア:
1. 変数を初期化します。
- 返される 2D 配列 (行列) を初期化します。
- 返される行数と各行のサイズのポインタを初期化します。
- スパイラルの現在の「レイヤー」の上下左右の境界の変数を初期化します。
- 次の値を行列に挿入するには、変数 val を 1 に初期化します。
2. 完了するまでループします:
- 上 <= 下、左 <= 右である限りループします。
3. 値を入力します。
- 上の行:上の行を左から右に塗りつぶし、上の境界を増分します。
- 右列:右列を上から下まで埋めてから、右境界を減らします。
- 下の行:下の行を右から左に塗りつぶし(上 <= 下の場合)、下の境界を減らします。
- 左の列:左の列を下から上に入力し (左 <= 右の場合)、左の境界を増分します。
4. 値を増やす:各セルに値を入力した後、次のセルの val の値を増やします。
5. 塗りつぶされた行列を返す:完全に塗りつぶされた 2D 配列を返します。
コード:
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
// Initialize the output array and sizes
int** output = (int**)malloc(n * sizeof(int*));
*returnColumnSizes = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; ++i) {
output[i] = (int*)malloc(n * sizeof(int));
(*returnColumnSizes)[i] = n;
}
*returnSize = n;
// Initialize variables for boundaries and direction
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int val = 1;
// Loop through the matrix to fill values
while (top <= bottom && left <= right) {
// Fill top row
for (int i = left; i <= right; ++i) {
output[top][i] = val++;
}
++top;
// Fill right column
for (int i = top; i <= bottom; ++i) {
output[i][right] = val++;
}
--right;
// Fill bottom row
if (top <= bottom) {
for (int i = right; i >= left; --i) {
output[bottom][i] = val++;
}
--bottom;
}
// Fill left column
if (left <= right) {
for (int i = bottom; i >= top; --i) {
output[i][left] = val++;
}
++left;
}
}
return output;
}