LeetCode //C - 59. スパイラルマトリックス II

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;
}

おすすめ

転載: blog.csdn.net/navicheung/article/details/132531174
おすすめ