[C++]LeetCode: 110 Spiral Matrix (螺旋输出矩阵元素)
来源:互联网 发布:21端口入侵工具 编辑:程序博客网 时间:2024/04/27 16:54
题目:
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]
.
思路:我们来自己画一个螺旋线的行走轨迹。我们会发现,螺旋始终重复四个遍历过程,向右遍历(列递增)-->向下遍历(行递增)-->向左遍历(列递减)-->向上遍历(行递减)。但是在螺旋线行走的过程中,我们的行列的上下边界一直在变。所以我们维护四个变量,rowBegin, rowEnd, colBegin, colEnd. 我们用这个四个变量来指示遍历时的边界。遍历终止条件是rowBegin > rowEnd || colBegin > colEnd. 需要注意的是,我们在向左遍历和向上遍历时,需要要遍历的行或者列是否存在,避免重复。
Attention:
1. 维护四个变量,来界定螺旋线遍历边界。
int rowBegin = 0;int rowEnd = row - 1;int colBegin = 0;int colEnd = col - 1;2. 螺旋行走条件必须满足。
while (rowBegin <= rowEnd && colBegin <= colEnd)3. 向左遍历和向上遍历时,为防止重复,需要先判断行列坐标值。
if (rowBegin <= rowEnd) //重要判断,防止重复 { //向左列递减遍历 for (int j = colEnd; j >= colBegin; j--) { ret.push_back(matrix[rowEnd][j]); } } rowEnd--; //遍历后,去掉此行 if (colBegin <= colEnd) //重要判断,防止重复 { //向上行递减遍历 for (int i = rowEnd; i >= rowBegin; i--) { ret.push_back(matrix[i][colBegin]); } } colBegin++; //遍历后,去掉此列复杂度:O(N), N为矩阵的元素总数
AC Code:
class Solution {public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> ret; if (matrix.empty()) return ret; int row = matrix.size(); int col = matrix[0].size(); int rowBegin = 0; int rowEnd = row - 1; int colBegin = 0; int colEnd = col - 1; //螺旋曲线,运动轨迹总是一致的 while (rowBegin <= rowEnd && colBegin <= colEnd) { //向右列递增遍历 for (int j = colBegin; j <= colEnd; j++) { ret.push_back(matrix[rowBegin][j]); } rowBegin++; //遍历后,去掉此行 //向下行递增遍历 for (int i = rowBegin; i <= rowEnd; i++) { ret.push_back(matrix[i][colEnd]); } colEnd--; //遍历后,去掉此列 if (rowBegin <= rowEnd) //重要判断,防止重复 { //向左列递减遍历 for (int j = colEnd; j >= colBegin; j--) { ret.push_back(matrix[rowEnd][j]); } } rowEnd--; //遍历后,去掉此行 if (colBegin <= colEnd) //重要判断,防止重复 { //向上行递减遍历 for (int i = rowEnd; i >= rowBegin; i--) { ret.push_back(matrix[i][colBegin]); } } colBegin++; //遍历后,去掉此列 } return ret; }};
0 0
- [C++]LeetCode: 110 Spiral Matrix (螺旋输出矩阵元素)
- [LeetCode] Spiral Matrix 螺旋输出矩阵
- LeetCode Spiral Matrix(螺旋矩阵)
- [C++]LeetCode: 111 Spiral Matrix II (螺旋写入矩阵)
- [LeetCode]-Spiral Matrix I&II 螺旋矩阵
- LeetCode Spiral Matrix II (生成螺旋矩阵)
- LeetCode 54. Spiral Matrix(螺旋矩阵)
- leetcode 59. Spiral Matrix II (螺旋矩阵)
- Spiral Matrix 螺旋矩阵
- LeetCode------54. Spiral Matrix(螺旋二维矩阵)-----59. Spiral Matrix II(n的螺旋矩阵)
- Spiral Matrix 螺旋矩阵I
- [LintCode] 螺旋矩阵 Spiral Matrix
- 54. Spiral Matrix 螺旋矩阵
- *[Lintcode]Spiral Matrix螺旋矩阵
- Spiral Matrix 输出旋转矩阵@LeetCode
- [算法][LeetCode]Spiral Matrix——螺旋矩阵
- LeetCode | Spiral Matrix II(螺旋矩阵填充数据)
- LeetCode OJ 之 Spiral Matrix (螺旋矩阵)
- android手势创建及识别
- 给手游开发者的7个建议
- 进制间的相互转换
- gitlab搭建问题总结
- 经典SQL语句大全
- [C++]LeetCode: 110 Spiral Matrix (螺旋输出矩阵元素)
- boost::log库,示例代码
- 黑马程序员——入学Blog08----分类
- 对listView的一些学习经验
- 启动另外的一个应用程序的Activity(三种方式)
- Uiautomator学习笔记
- -字朋友-
- IOS ARC跟block那点事
- 无法打开登录所请求的数据库,登录失败