leetcode原题链接:螺旋矩阵
题目描述
给你一个 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]
解题方法: 按照右->下->左->上的方向,依次遍历数组中没有遍历过的元素,每遍历完一个方向,就将对应的边界缩小。用一个变量total_num来记录当前还有多少元素没有遍历,每遍历一个元素,total_num的值减1,直到所有的元素都被遍历过即可。
C++代码
#include <iostream>
#include <vector>
class Solution {
public:
std::vector<int> spiralOrder(std::vector<std::vector<int>>& matrix) {
int m = matrix.size(); //行数
int n = matrix[0].size(); //列数
int left = 0;
int right = n - 1;
int up = 0;
int down = m - 1;
std::vector<int> result; //结果数组
int total_num = m * n;//表格中总共有多少元素
while (total_num > 0) {
// 向右:遍历当前最上层
for (int j = left; j <= right && total_num > 0; j++) { //total_num>0的条件不能少,否则可能存在重复遍历
result.emplace_back(matrix[up][j]);
total_num--;
}
++up; // 上边界下移
// 向下:遍历当前最右列
for (int i = up; i <= down && total_num > 0; i++) { //total_num>0的条件不能少,否则可能存在重复遍
result.emplace_back(matrix[i][right]);
total_num--;
}
--right;//右边界左移
// 向左:遍历当前最下面行
for (int j = right; j >= left && total_num > 0 ; j-- ) {//total_num>0的条件不能少,否则可能存在重复遍
result.emplace_back(matrix[down][j]);
total_num--;
}
--down; //下边界上移
// 向上:遍历当前最左边列
for (int i = down; i >= up && total_num > 0; i--) {//total_num>0的条件不能少,否则可能存在重复遍
result.emplace_back(matrix[i][left]);
total_num--;
}
++left;//左边界右移
}
return result;
}
};