LeetCode 54. Spiral Matrix && 59. Spiral Matrix II
阿新 • • 發佈:2018-11-07
題解
螺旋遍歷矩陣大總結,給出一個優雅清晰的解法。
大概思路是模擬移動方向,計算xy位置。
比如n*m的矩陣,按右下左上的順序,依次移動的步數是
{ m, n-1 , m-1 , n-2, …, 0 } 直到遇到第一個0。
其中左右的步數 { m, m-1 , m-2 … }
上下的步數 { n-1, n-2, n-3, … }
所以可以用個 step[2] = {m,n-1} 來記錄剩餘步數
每走完一行列就-1,直到遇到0。
看程式碼吧,思路清楚。
Code
class Solution {
public:
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.empty()) return res;
int n=matrix.size(),m=matrix[0].size();
if(n==0||m==0) return res;
int step[2]={m,n-1};// steps need to move
int D=0;// direction
int nx,ny;
nx=0,ny=-1;
while(step[D%2]!=0){
for(int i=0;i<step[D%2];i++){
nx+=dx[D];
ny+=dy[D];
res.push_back(matrix[nx][ny]);
}
step[D%2]--;
D= (D+1)%4;
}
return res;
}
};
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n));
int step[2]={n,n-1};
int D=0;
int nx,ny,k=1;
nx=0,ny=-1;
while(step[D%2]!=0){
for(int i=0;i<step[D%2];i++){
nx+=dx[D];
ny+=dy[D];
res[nx][ny]=k++;
}
step[D%2]--;
D=(D+1)%4;
}
return res;
}