剑指 Offer 29. 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 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]

限制:

0 <= matrix.length <= 100

0 <= matrix[i].length <= 100

思路:首先自己在33和4 4的数组中尝试螺旋遍历,会发现规律。

当向右遍历时,其实是从上到下遍历行。rowBegin -》 rowEnd

当向下遍历时,其实是从右到左遍历列。colEnd -》 colBegin

当向左遍历时,其实是从下到上遍历行。rowEnd -》 rowBegin

当向上遍历时,其实是从左到右遍历列。 colBegin -》 colEnd

cpp 复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> result; // 存储结果的向量

        if (matrix.empty()) // 如果矩阵为空,直接返回结果向量
            return result;

        // 定义边界变量
        int rowBegin = 0; // 行的起始位置
        int colBegin = 0; // 列的起始位置
        int rowEnd = matrix.size() - 1; // 行的结束位置
        int colEnd = matrix[0].size() - 1; // 列的结束位置

        // 不断缩小边界进行遍历,直到边界重合或交错
        while(rowBegin <= rowEnd && colBegin <= colEnd) {
            // 从左到右遍历当前行
            for (int i = colBegin; i <= colEnd; i++) {
                result.push_back(matrix[rowBegin][i]); // 将当前元素添加到结果向量
            }
            rowBegin++; // 增加起始行索引,排除已遍历的行

            // 从上到下遍历当前列
            for (int i = rowBegin; i <= rowEnd; i++) {
                result.push_back(matrix[i][colEnd]); // 将当前元素添加到结果向量
            }
            colEnd--; // 减少结束列索引,排除已遍历的列

            // 从右到左遍历当前行
            if (rowBegin <= rowEnd) { // 检查是否还有剩余的行未遍历
                for (int i = colEnd; i >= colBegin; i--) {
                    result.push_back(matrix[rowEnd][i]); // 将当前元素添加到结果向量
                }
                rowEnd--; // 减少结束行索引,排除已遍历的行
            }

            // 从下到上遍历当前列
            if (colBegin <= colEnd) { // 检查是否还有剩余的列未遍历
                for (int i = rowEnd; i >= rowBegin; i--) {
                    result.push_back(matrix[i][colBegin]); // 将当前元素添加到结果向量
                }
                colBegin++; // 增加起始列索引,排除已遍历的列
            }
        }

        return result; // 返回结果向量
    }
};
相关推荐
FMRbpm4 分钟前
栈练习--------(LeetCode 739-每日温度)
数据结构·c++·算法·leetcode·新手入门
子一!!4 分钟前
数据结构==二叉平衡树,AVL树 ===
数据结构·算法
Mr_Oak5 分钟前
【multi-model】DINOv2(包含iBOT)& 问答
图像处理·人工智能·深度学习·算法·多模态·对比学习·视觉大模型
七夜zippoe9 分钟前
轻量模型微调:LoRA、QLoRA实战对比与工程实践指南
人工智能·深度学习·算法·lora·qlora·量化训练
youngee1110 分钟前
hot100-44从前序与中序遍历构造二叉树
数据结构·算法
im_AMBER12 分钟前
Leetcode 68 搜索插入位置 | 寻找比目标字母大的最小字母
数据结构·笔记·学习·算法·leetcode
严文文-Chris14 分钟前
【非监督学习常见算法】
学习·算法·机器学习
CoderYanger15 分钟前
动态规划算法-斐波那契数列模型:1.第N个泰波那契数
开发语言·算法·leetcode·动态规划·1024程序员节
红队it18 分钟前
【机器学习】python旅游数据分析可视化协同过滤算法推荐系统(完整系统源码+数据库+开发笔记+详细部署教程)✅
python·mysql·算法·机器学习·数据分析·旅游
我太想进步了C~~18 分钟前
Prompt Design(提示词工程)入门级了解
前端·人工智能·算法