Description:
Given a matrix of m x n elements
(m rows, n columns),
return all elements of the matrix in spiral order.
Note:
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
Solution:
Analysis and Thinking:
這是一個明顯的螺旋矩陣遍歷的問題,要求按照規定的(螺旋順序)次序來遍歷輸入的矩陣,輸出遍歷完成後的數組。可以將遍歷過程分層分佈進行,對於矩陣的每一層i,進行的都是向右、向下、向左、向上這四步順序操作,因此,解決問題的重點是求得每一步操作最終到達的位置。
Steps:
1.依據min(mSize,rSize)/2,獲得螺旋順序遍歷矩陣的分層數layer,其中mSize爲矩陣大小,rSize爲矩陣每行大小
2.從第1層到第layer層,遍歷矩陣,每一層的起點爲(i,i)
3.先向右到達本層最右的位置(i,rSize-1-i),並將遍歷到的每個元素添加到結果數組
4.再向下到達本層(mSize-1-i,rSize-1-i)的位置,並將遍歷到的每個元素添加到結果數組
5.判斷向左是否已到達邊界,若無,則向左到達(m-1-i,i)的位置,並將遍歷到的每個元素添加到結果數組
6.判斷向上是否已到達邊界,若無,則向上到達(i,i)的位置,並將遍歷到的每個元素添加到結果數組
7.若沒有到達總層數,i+1,跳至2,若有,返回結果數組
Codes:
class Solution
{
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
vector<int> result;
if(matrix.empty() || matrix[0].empty())
return result;
int mSize=matrix.size();
int rSize=matrix[0].size();
int mLayer=(min(mSize,rSize)+1)/2;
for(int i=0;i<mLayer;i++)
{
for(int j=i;j<rSize-i;j++)
{
result.push_back(matrix[i][j]);
}
for(int j=i+1;j<mSize-i;j++)
result.push_back(matrix[j][rSize-1-i]);
if(mSize-1-i>i)
for(int j=rSize-1-i-1;j>=i;j--)
result.push_back(matrix[m-1-i][j]);
if(rSize-1-i>i)
for(int j=mSize-1-i-1;j>i;j--)
result.push_back(matrix[j][i]);
}
return result;
}
};
Results: