配列 | 59. スパイラル マトリックス II

トピックリンク: 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;
    }
};

おすすめ

転載: blog.csdn.net/weifengomg/article/details/128240905