算法设计与分析 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:
You should return
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:
Results:
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:
相关文章推荐
- 算法分析与设计课程(6):【leetcode】Sudoku
- 算法分析与设计课程(10):【leetcode】Simplify Path
- [算法分析与设计] leetcode 每周一题: 62. Unique Paths
- 算法分析与设计丨第三周丨LeetCode(5)——Median of Two Sorted Arrays(Hard)
- 算法分析与设计丨第一周丨 LeetCode(1)——Two Sum
- 算法分析与设计——LeetCode Problem.2 Add Two Numbers
- 算法分析与设计课程(7):【leetcode】Reverse Nodes in k-Group
- 算法分析与设计——LeetCode Problem.2 Add Two Numbers
- 算法分析与设计丨第一周丨LeetCode(2)——Different Ways to Add Parentheses(Medium)
- 算法分析与设计丨第三周丨LeetCode(6)——Find Largest Value in Each Tree Row(Medium)
- 算法分析与设计课程(11):【leetcode】Gray Code
- 算法分析与设计课程(19):【leetcode】Ugly Number II
- 算法分析与设计课程(15):【leetcode】 Find Minimum in Rotated Sorted Array
- 算法分析与设计——LeetCode:2.Add Two Numbers
- 算法分析与设计课程(4):【leetcode】Wildcard Matching
- 算法分析与设计课程(16):【leetcode】 Integer to Roman
- 算法分析与设计课程(12):【leetcode】 Count Complete Tree Nodes
- 算法分析与设计课程(18):【leetcode】Clone Graph
- [算法分析与设计] leetcode 每周一题: 215. Kth Largest Element in an Array
- 算法分析与设计课程(3):【leetcode】Permutations