LeetCode54 59 螺旋矩陣 螺旋矩陣II (陣列)
阿新 • • 發佈:2018-11-01
1.螺旋矩陣
給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。
示例 1:
輸入:
[ [ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]]
輸出: [1,2,3,6,9,8,7,4,5]
示例 2:
輸入:
[[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:
[[1 , 2 , 3 , 4 ] ,
[5, 6, 7, 8],
[9,10,11,12]]
邊1+邊2:
[[1 , 2 , 3 , 4 ] ,
[5, 6, 7, 8 ],
[9,10,11,12 ]]
邊1+邊2+邊3:
[[1 , 2 , 3 , 4 ] ,
[5, 6, 7, 8 ],
[9 ,10 ,11 ,12 ]]
邊1+邊2+邊3+邊4:
[[1 , 2 , 3 , 4 ] ,
[5 , 6, 7, 8 ],
[9 ,10 ,11 ,12 ]]
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> empty_matrix;
if(matrix.size()==0) return empty_matrix;
vector<int> spiralarray;
int colums=matrix[0].size();
int rows=matrix.size();
int loop=rows<colums?(rows+1)/2:(colums+1)/2;
int col=colums,row=rows;
for(int i=0;i<loop;i++){
for(int a=i;a<colums-i;a++){
spiralarray.push_back(matrix[i][a]);
}
for(int b=i+1;b<rows-i;b++){
spiralarray.push_back(matrix[b][colums-i-1]);
}
if(col==1 || row==1) break;
for(int c=colums-i-2;c>i-1;c--){
spiralarray.push_back(matrix[rows-i-1][c]);
}
for(int d=rows-i-2;d>i;d--){
spiralarray.push_back(matrix[d][i]);
}
col=col-2;
row=row-2;
}
return spiralarray;
}
};
2.螺旋矩陣II
給定一個正整數 n,生成一個包含 1 到
所有元素,且元素按順時針順序螺旋排列的正方形矩陣。
示例:
輸入: 3
輸出:
[ [ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]]
解題思路:思路類似於螺旋矩陣, 只不過先請求一個容器,然後賦值到每個索引即可。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> tempMatrix(n,vector<int>(n));
int value=1;
int topLoop=(n+1)/2;
int col=n;
int row=n;
for(int loop=0;loop<topLoop;++loop){
for(int a=loop;a<n-loop;++a){
tempMatrix[loop][a]=value;
++value;
}
for(int b=loop+1;b<n-loop;++b){
tempMatrix[b][n-loop-1]=value;
++value;
}
if(col==1 || row==1){
break;
}
for(int c=n-loop-2;c>loop-1;--c){
tempMatrix[n-loop-1][c]=value;
++value;
}
for(int d=n-loop-2;d>loop;--d){
tempMatrix[d][loop]=value;
++value;
}
row=row-2;
col=col-2;
}
return tempMatrix;
}
};```