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

leetcode 498.对角线遍历

498.对角线遍历

0. 题目

1. 思路

模拟大法🧐

看完题目之后,先来模拟一下路线:
在这里插入图片描述

找规律

不难发现可以把整个遍历过程看成一排排整体向上走整体向下走(注意第一个元素和最后一个元素要分别看成向上走和向下走)。

问题规约:一步步解决小问题

1️⃣只要不断地i--j++就可以实现向上走了,向下走则是i++j--

2️⃣那么什么时候停止这个方向上的遍历呢?

当遇上“碰壁”的时候,就可以停止了。在向上走的时候会碰上壁右壁,再向下走的时候会碰下壁左壁。根据这个规律就很容易写出循环停止的条件。

3️⃣还有一个要解决的问题就是,碰壁之后往哪走?也就是下一排的第一个元素是谁?

  • 整体向上走

    • 碰上壁,向右走
    • 碰右壁,向下走
  • 整体向下走

    • 碰下壁,向右走
    • 碰左壁,向下走

此时思路已经非常清晰了。思路很简单是个笨方法,但是很好写代码~

2. 代码

class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
        vector<int> order; // 存放答案

        int row=mat.size(); // 计算行数
        if(row==0)return{};// 空矩阵的处理
        int col=mat[0].size();// 计算列数

        int i=0,j=0; // 从左上角第一个元素开始遍历
        int di=0;//整体的遍历方向:0表示up;1表示down

        while(order.size()<row*col){//注意:不是<=
            if(di==0){  //整体遍历方向为up的话,会碰到上壁或右壁
                while(i>=0 && j<col){ // 所以要判断i和j的合法性
                    order.push_back(mat[i][j]);
                    i--;j++;    // 每遍历完一个元素,都向右向上更新i和j
                }
                i++;j--;// 返回来刚才的while循环中遍历到的最后一个合法的元素
                // 这个时候或者右走(碰上壁),或者向下走(碰右壁)
                if(j==col-1){i++;} // 碰右壁的话,向下走
                else{j++;}// 碰上壁的话向右走
                di=1; // 更换整体的遍历方向为down
            }
            else if(di==1){ //整体遍历方向为down的话,会碰到下壁或左壁;下面的逻辑和上面的逻辑相似。
                while(j>=0 && i<row){
                    order.push_back(mat[i][j]);
                    i++;j--;
                }
                i--;j++;
                if(i==row-1){j++;}
                else{i++;}
                di=0; // 更换整体的遍历方向为up
            }
        }
        return order;// 最后返回答案
    }
};

3. 效率

执行用时分布 0ms 击败100.00%

消耗内存分布 21.48MB 击败85.74%


http://www.kler.cn/news/367110.html

相关文章:

  • Flink CDC系列之:学习理解核心概念——Data Pipeline
  • Xcode真机运行正常,打包报错
  • UML 总结(基于《标准建模语言UML教程》)
  • STM32传感器模块编程实践(十一) ADC模数转换模块ADS1115简介及驱动源码
  • 【论文阅读】ESRGAN+
  • 【南方科技大学】CS315 Computer Security 【Lab6 IoT Security and Wireless Exploitation】
  • 常用的无穷小等价替换
  • HRCE第二次实验
  • K8S系列-Kubernetes网络
  • Vue3的Composition组合式API(readonly与shallowReadonly函数、toRaw与markRaw函数、customRef函数)
  • [ComfyUI]与 FLUX.1[dev] 一样优秀的商业用途模型 OpenFLUX.1 现已面世!
  • 常用sql
  • 记录下docker部署gitlab-ce-17.5版本及客户端git拉取方式配置
  • AI视频!OpenAI发布最新模型sCM,开启图像、音频、视频、三维模型AI新时代
  • 【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
  • Vscode + EIDE +CortexDebug 调试Stm32(记录)
  • ATom:2016-2018 年沿飞行轨迹的 CAM-chem/CESM2 模型输出
  • 编写一个简单的Iinput_dev框架
  • 权益资本成本-CAPM模型、MPEG模型、OJ模型、PEG模型、原始数据及其代码(2000-2021年)
  • 【ESP32S3 Sense接入阿里云大模型图像理解】
  • GDB 从裸奔到穿戴整齐
  • 2024 BuildCTF 公开赛|Crypto
  • SpringBoot中EasyExcel使用实践总结
  • 【Redis 设计与实现】String 的数据结构如何实现的?
  • RN安卓应用打包指南
  • 帝国CMS 内容页调用上一篇下一篇的方法(精华汇总)