LeetCode 刷题 [C++] 第54题.螺旋矩阵

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

题目分析

  1. 根据题意可知,我们不需要记录已经走过的路径,只需要通过调整矩阵的上下左右边界即可完成任务;
  2. 首先创建出矩阵的上下左右边界;
  3. 开始遍历矩阵:
    先从左上角,从左向右遍历第一行,然后删除第一行,即重新定义上边界;
    然后判断重新定义后的上下边界是否交错,如果交错,则表示螺旋矩阵遍历结束,跳出循环,返回数组;
    如果重新定义后的边界没有交错,则接着遍历矩阵;
  4. 使用3中类似的逻辑接着向下向左向上移动;
  5. 不断循环步骤3和4,直至某两个边界交错,跳出循环为止,最后返回结果。

Code

cpp 复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.empty()) return {};
        vector<int> res;
        res.reserve(matrix.size()*matrix[0].size()); //预分配容器的大小
        int upper = 0, down = matrix.size() - 1;
        int left = 0, right = matrix[0].size() - 1;
        while (true) {
        	// 向右遍历
            for (int i = left; i <= right; ++i) {
                res.emplace_back(matrix[upper][i]);
            }
            if (++upper > down) {
                break;
            }
			// 向下遍历
            for (int i = upper; i <= down; ++i){
                res.emplace_back(matrix[i][right]);
            }
            if (--right < left) {
                break;
            }
			// 向左遍历
            for (int i = right; i >= left; --i) {
                res.emplace_back(matrix[down][i]);
            }
            if (--down < upper) {
                break;
            }
			// 向上遍历
            for (int i = down; i >= upper; --i) {
                res.emplace_back(matrix[i][left]);
            }
            if (++left > right) {
                break;
            }
        }
        return res;
    }
};
相关推荐
土司大王9 分钟前
LeetCode hot100——缺失的第一个正数
数据结构·算法·leetcode
布莱克60513 分钟前
strcpy 函数详解:作用、用法与安全缺陷
c语言·开发语言·c++·安全
Cccp.12315 分钟前
【leetcode】(二)认识O(NlogN)的排序
算法·leetcode
不想看见40421 分钟前
一次关于“鼠标是不是串口”的追问:从USB协议到CAN总线
c++·qt·计算机外设
Zenova EdgeOS37 分钟前
等保 2.0 在工业网关的落地:测评点、整改、长期维护
c++·边缘计算·工业网关
牛油果子哥q1 小时前
C++大型项目工程精讲:CMake完整实战、静态库&动态库、模块化拆分、单元测试、gdb调试、性能工具、工程踩坑全解
开发语言·c++·单元测试
Dream Cosmos1 小时前
C++ 多态上篇:从 virtual 到抽象类,彻底理解多态的使用
开发语言·c++
鹿角片ljp1 小时前
LeetCode 56:合并区间复盘|从排序思维到 List<int[]> 的简洁写法
算法·leetcode·list
秋田君2 小时前
Qt_Qt(c++)开发中常见错误与解决方法
开发语言·c++·qt
星恒随风2 小时前
C++11详解(一):统一初始化——列表初始化与 initializer_list
c++·笔记·学习·list·状态模式