您的位置:首页 > 其它

算法设计与分析 HW6:LeetCode 54

2017-04-10 19:32 351 查看
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:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息