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;}
};