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

力扣HOT100之矩阵:54. 螺旋矩阵


这道题之前在代码随想录里刷过类似的,还有印象,我就按照当初代码随想录的思路做了一下,结果怎么都做不对,因为按照代码随想录的边界条件设置,当行数和列数都为奇数时,最后一个元素无法被添加到数组中,搞得很伤脑筋,然后我看了下灵神的代码,感觉还是有点太难懂了,我感觉Krahets大佬的代码思想和我的比较贴合,而且也比较好懂,我就直接采用他的思路了。他的思路比较朴素,就是按照上-->右-->下-->左的顺序遍历矩阵,然后将遍历到的元素添加到数组中,但是这个思路中是遍历一条边后就立刻更新对应的边界,例如,刚刚把上边界的所有元素添加到数组后,就立刻将上边界+1,然后遍历右边的边时,右边是直接从更新后的上边界为起点开始遍历的(这就意味着在同一圈中,上边界添加的元素一定比下边界添加的多,右边界添加的元素一定比左边界添加的多),另外,只要当前的下标值 <= 或者 >= 对应的边界值,我们就无脑添加,为了避免重复添加的问题,我们就需要在更新完边界以后立即判断上下边界有没有交错(up < down),左右边界有没有交错(left > right),如果出现了这样的情况,就说明已经打印完了所有元素,无需再继续遍历,直接退出当前的循环。
在退出循环之后,直接返回数组即可。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> result;
        int up, right, down, left;   //上下左右四个边界
        up = 0;
        right = matrix[0].size() - 1;
        down = matrix.size() - 1;
        left = 0;
        while(up <= down && left <= right){
            //上
            for(int i = left; i <= right; ++i)
                result.emplace_back(matrix[up][i]);
            if(++up > down) break;  //添加结束
            //右
            for(int i = up; i <= down; ++i)
                result.emplace_back(matrix[i][right]);
            if(--right < left) break;  //添加结束
            //下
            for(int i = right; i >= left; --i)
                result.emplace_back(matrix[down][i]);
            if(--down < up) break;  //添加结束
            //左
            for(int i = down; i >= up; --i)
                result.emplace_back(matrix[i][left]);
            if(++left > right) break;
        }
        return result; 
    }
};

相关文章:

  • 区块链技术之分布式数字身份:构建数字世界的信任基石
  • 青少年编程与数学 02-013 初中数学知识点 01课题、小学数学回顾
  • Ubuntu / Debian 创建快捷方式启动提权
  • 开发体育赛事直播系统:炫彩弹幕直播间界面技术实现方案
  • PE文件导入表解析
  • Spring-事务属性
  • 一条命令配置移动端(Android / iOS)自动化环境
  • 9、Linux C 消息队列和信号灯
  • leetcode 2360. 图中的最长环 困难
  • 什么是动态代理?动态代理和静态代理的区别
  • 轮询、WebSocket 和 SSE:实时通信技术全面指南(含C#实现)
  • 从零开始打造HTML5拼图游戏:一个Canvas实战项目
  • hadoop集群配置-scp拓展使用
  • 基于WebSocket的金融数据实时推送系统架构设计对接多国金融数据API
  • SQL SELECT DISTINCT 语句详解:精准去重的艺术
  • Leetcode-100 二叉树引发的递归思考
  • SpringBoot整合Elasticsearch详细教程
  • [Html]overflow: auto 失效原因,flex 1却未设置min-height overflow的几个属性以及应用场景
  • 前沿技术有哪些改变生活新趋势
  • c#使用forms实现helloworld和login登录
  • 微网站建设比较全面的是/新闻软文自助发布平台
  • wordpress的页面标题/广州seo优化外包服务
  • 郑州网站建设外包业务/aso优化分析
  • 日本做爰动漫网站/app开发费用一览表
  • 深圳网站建设代理商/品牌策划是做什么的
  • 江苏网站建设价格/网站管理工具