オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示します。
I.はじめに
行と列の m
マトリックス 与えられた 場合、マトリックス内のすべての要素を時計回りのスパイラル順序 で返します 。 n
matrix
トピックリンク:スパイラル行列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.問題分析
この質問は主に、比較的古典的なトピックであるシミュレーションのアイデアを調べます。
まず、方向と境界の問題を特定しましょう。まず、上、下、左、右の4つの方向として定義します。
4文字のu、d、l、rで表されます
その中で、u = 0(一番上の行)、d =行数、l = 0(左端の列)、r=列数です。
上の写真を見て、実際にそれぞれの状況をシミュレートします
-
1-> 2-> 3-> 4は、 l-> rの方向を表します。ここで、row = u、列はl-> rから徐々に+1され、4に達した後、8に下がり、uは1行をドロップします+ + u
-
8-> 12-> 16は、 u-> dの方向を表します。ここで、列= r、行はu-> dから徐々に+1され、16の後、左に曲がって15になり、rは1列を左に移動します。r
-
15-> 14-> 13は、 r-> lの方向を表します。ここで、row = d、列はr-> lから徐々に-1になり、13の後、9になり、dは1行上に移動します。-- d
-
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;
}
};
复制代码