アルゴリズムは毎日の練習に質問します---64日目:スパイラル行列I

オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示します。

I.はじめに

 行と列の m マトリックス 与えられた 場合、マトリックス内のすべての要素を時計回りのスパイラル順序 で返します 。 nmatrix

トピックリンク:スパイラル行列I。

第二に、主題の要件

例1

输入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]
复制代码

例2

输入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
复制代码

訪問

1.模拟计算
2.建议用时25~35min
复制代码

3.問題分析

この質問は主に、比較的古典的なトピックであるシミュレーションのアイデアを調べます。

1.png

まず、方向と境界の問題を特定しましょう。まず、上、下、左、右の4つの方向として定義します。

4文字のu、d、l、rで表されます

その中で、u = 0(一番上の行)、d =行数、l = 0(左端の列)、r=列数です。

上の写真を見て、実際にそれぞれの状況をシミュレートします

  1. 1-> 2-> 3-> 4は、 l-> rの方向を表します。ここで、row = u、列はl-> rから徐々に+1され、4に達した後、8に下がり、uは1行をドロップします+ + u

  2. 8-> 12-> 16は、 u-> dの方向を表します。ここで、列= r、行はu-> dから徐々に+1され、16後、左に曲がって15になり、rは1列を左に移動します。r

  3. 15-> 14-> 13は、 r-> lの方向を表します。ここで、row = d、列はr-> lから徐々に-1になり、13の後、9になり、dは1行上に移動します。-- d

  4. 9->5はd->uの方向を表します。ここで、column = l、d-> uからの行は徐々に-1になり、5に達した後、右に曲がり、lは1列を右に移動します。++ l

上記は、ループの内側の境界を判断するための、ループ内の4つの操作です。

  • 最初のステップ++u>d、ループを終了します
  • 2番目のステップ--r<l、ループを終了します
  • 3番目のステップ--d<u、ループを終了します
  • 4番目のステップ++l>r、ループを終了します

次のコードは上記の手順に厳密に対応しています。皆さんが理解できることを願っています。

第四に、エンコーディングの実装

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int i,u=0,d=matrix.size()-1,l=0,r=matrix[0].size()-1;//确定边界,初始化数据
        vector<int>v;//数组存储
        while(1)//循环内四步转换
        {
            for(i=l;i<=r;i++) v.push_back(matrix[u][i]);//l->r方向
            if(++u>d) break;
            for(i=u;i<=d;i++) v.push_back(matrix[i][r]);//u->d方向
            if(--r<l) break;
            for(i=r;i>=l;i--) v.push_back(matrix[d][i]);//r->l方向
            if(--d<u) break;
            for(i=d;i>=u;i--) v.push_back(matrix[i][l]);//d->u方向
            if(++l>r) break;
        }
        return v;
    }
};
复制代码

5.テスト結果

2.png

3.png

おすすめ

転載: juejin.im/post/7080305745694031909