给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
54. 螺旋矩阵 - 力扣(Leetcode)
思路:二维数组的花式遍历技巧 :: labuladong的算法小抄
定义四个变量: upper_bound、lower_bound、left_bound 与 right_bound
upper_bound 表示要遍历的最上边一行;
right_bound 表示要遍历的最右边一行;
lower_bound 表示要遍历最下边一行;
left_bound 表示要遍历的最左边一行。
按照上面说的顺序来遍历矩阵,并将元素 copy到结果数组中
c++
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int upper_bound = 0, lower_bound=m-1;
int left_bound = 0, right_bound = n-1;
vector<int> result;
while(result.size() < m*n) {
//cout<< upper_bound<< ","<<lower_bound <<"," << left_bound <<","<<right_bound<<endl;
// 最顶上一行,从左到右遍历
if(upper_bound <= lower_bound) { // 保证不溢出数组且
for(int i=left_bound; i<=right_bound; i++) {
result.push_back(matrix[upper_bound][i]);
}
upper_bound++; // 最上边一行下移一个
}
// 最右边一列,从上到小遍历
if(left_bound <= right_bound) {
for(int i=upper_bound; i<=lower_bound; i++) {
result.push_back(matrix[i][right_bound]);
}
right_bound--; // 最右边一列左移一个
}
// 最下边一行,从右到左遍历
if(upper_bound <= lower_bound) {
for(int i=right_bound; i>=left_bound; i--) {
result.push_back(matrix[lower_bound][i]);
}
lower_bound--;
}
// 最左边一列,从下到上遍历
if(left_bound <= right_bound) {
for(int i=lower_bound; i>=upper_bound; i--) {
result.push_back(matrix[i][left_bound]);
}
left_bound++;
}
}
return result;
}
};