当前位置: 首页 > news >正文

力扣hot100——螺旋矩阵 超简单易懂的模拟搜索方法

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

解法思路:

        // 模拟螺旋搜索设定四个边界
        //    left               right
        //  top |————————————————|
        //      |                |
        //      |                |
        // down |————————————————|

        // 从左往右搜索,搜索完后向下,上边界下移
        // 从上往下搜索,搜索完后向左,右边界左移
        // 从右往左搜索,搜索完后向上,下边界上移
        // 从下往上搜索,搜索完后向右,左边界右移
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        // 模拟螺旋搜索设定四个边界
        //    left               right
        //  top |————————————————|
        //      |                |
        //      |                |
        // down |————————————————|

        // 从左往右搜索,搜索完后向下,上边界下移
        // 从上往下搜索,搜索完后向左,右边界左移
        // 从右往左搜索,搜索完后向上,下边界上移
        // 从下往上搜索,搜索完后向右,左边界右移

        vector<int> res;
        int left = 0, right = matrix[0].size(),top = 0, down = matrix.size();
        while(left < right && top < down){
            // 从左往右搜索,搜索完后向下,上边界下移动
            for(int i = left; i < right; i++){
                res.push_back(matrix[top][i]);  // 上边界行
            }
            ++top;
            if(top >= down){ // 只有一行
                break;
            }

            // 从上往下搜索,搜索完后向左,右边界左移
            for(int i = top; i < down; i++){
                res.push_back(matrix[i][right-1]); // 外边界列
            }
            --right;
            if(left >= right){  // 只有一列
                break;
            }

            // 从右往左搜索,搜索完后向上,下边界上移
            for(int i = right-1; i>=left;i--){
                res.push_back(matrix[down-1][i]); // 下边界行加入
            }
            --down;
            if(top >= down){ // 遍历结束
                break;
            }

            // 从下往上搜索,搜索完后向右,左边界右移
            for(int i = down-1; i>=top;i--){
                res.push_back(matrix[i][left]);  // 左边界列
            }
            ++left;
            if(left >= right){  // 遍历结束
                break;
            }
        }
        return res;
    }
};

相关文章:

  • 专题--Redis
  • STM32 HAL库标准库+ESP8266+机智云
  • 树莓派4基于Debian GNU/Linux 12 (Bookworm)添加多个静态ipv4网络
  • 【找工作】C++和算法复习(自用)
  • MySQL(2)索引篇
  • 金融数据库数字化转型:性能优化的实战经验
  • 【自动化脚本工具】Hammerspoon (Mac)
  • OpenCV对比度增强
  • 【Python】Python入门——笔记合集
  • 5.5 Soft Prompt技术:任务特定微调的新范式
  • 循环神经网络RNN原理与优化
  • Interactive High-Quality Green-Screen Keying via Color Unmixing
  • vue 父组件和子组件中v-model和props的使用和区别
  • 形参和实参
  • 强化学习入门
  • 12.按身高排序(贪心)思路解析+源码
  • C++初阶——简单实现vector
  • 动态规划(Dynamic Programming)详解
  • PLC扫描周期和工作原理
  • 【SQL】多表查询案例
  • 年轻人的事业!6家上海人工智能企业畅想“模范生”新征程
  • 五月院线片单:就看五一档表现了
  • 辽宁辽阳市白塔区一饭店发生火灾,事故已造成22人遇难3人受伤
  • 比熬夜更伤肝的事,你可能每天都在做
  • 费高云调研党的建设工作:营造风清气正劲足的政治生态
  • 西班牙葡萄牙突发全国大停电,欧洲近年来最严重停电事故何以酿成