54. Spiral Matrix
来源:互联网 发布:淘宝装修视频教程全集 编辑:程序博客网 时间:2024/05/09 07:35
题目:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
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]
.、
题意:
给定一个m行n列的数组,将该数组按螺旋状输出。
思路:
转载地址:https://leetcode.com/discuss/38974/a-concise-c-implementation-based-on-directions
When traversing the matrix in the spiral order, at any time we follow one out of the following four directions: RIGHT DOWN LEFT UP. Suppose we are working on a 5 x 3 matrix as such:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Imagine a cursor starts off at (0, -1), i.e. the position at '0', then we can achieve the spiral order by doing the following:
- Go right 5 times
- Go down 2 times
- Go left 4 times
- Go up 1 times.
- Go right 3 times
- Go down 0 times -> quit
Notice that the directions we choose always follow the order 'right->down->left->up', and for horizontal movements, the number of shifts follows:{5, 4, 3}, and vertical movements follows {2, 1, 0}.
Thus, we can make use of a direction matrix that records the offset for all directions, then an array of two elements that stores the number of shifts for horizontal and vertical movements, respectively. This way, we really just need one for loop instead of four.
Another good thing about this implementation is that: If later we decided to do spiral traversal on a different direction (e.g. Counterclockwise), then we only need to change the Direction matrix; the main loop does not need to be touched.
代码:class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<vector<int> > dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; vector<int> res; int nr = matrix.size(); if (nr == 0) return res; int nc = matrix[0].size(); if (nc == 0) return res; vector<int> nSteps{nc, nr-1}; int iDir = 0; // index of direction. int ir = 0, ic = -1; // initial position while (nSteps[iDir%2]) { for (int i = 0; i < nSteps[iDir%2]; ++i) { ir += dirs[iDir][0]; ic += dirs[iDir][1]; res.push_back(matrix[ir][ic]); } nSteps[iDir%2]--; iDir = (iDir + 1) % 4; } return res; }};
- 54. Spiral Matrix && 59. Spiral Matrix II
- 59. Spiral Matrix II && 54. Spiral Matrix
- LeetCode 54. Spiral Matrix
- [LeetCode]54.Spiral Matrix
- LeetCode --- 54. Spiral Matrix
- [Leetcode] 54. Spiral Matrix
- [leetcode] 54.Spiral Matrix
- 54. Spiral Matrix
- Leetcode-54.Spiral Matrix
- **LeetCode 54. Spiral Matrix
- Leetcode 54. Spiral Matrix
- [leetcode] 54. Spiral Matrix
- 54. Spiral Matrix
- leetcode 54. Spiral Matrix
- 54. Spiral Matrix LeetCode
- 54. Spiral Matrix
- 54. Spiral Matrix
- leetcode 54. Spiral Matrix
- UITableView的两种重用Cell方法的区别
- 你们关心的租房的那些事
- android自定义LoadPager页面,再也不用担心重复的代码啦
- Java运行时故障排查
- 在Ubuntu Server 32bit搭建hustoj -- 中
- 54. Spiral Matrix
- Android 与web的相互调用
- ListView异步加载 LruCache缓存 滑动状态监听
- 账单支付流程
- NYIT 45 棋盘覆盖
- Android Studio系列教程六--Gradle多渠道打包
- 安卓UI控件拖拽的几种方法
- 机器学习: 特征脸算法 EigenFaces
- 传统图像、现代图像、人工智能时代图像算法工程师的研究内容