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

每日一题——力扣498 对角线遍历

力扣498 对角线遍历

问题分析

给定一个 m x n 矩阵,我们需要按照对角线顺序遍历所有元素。对角线遍历的特点是:

  • 每条对角线上元素的行索引与列索引之和为常数
  • 遍历方向交替变化:奇数对角线(从右上到左下),偶数对角线(从左下到右上)

在这里插入图片描述

解决方案

核心思路

  1. 确定对角线常数k:从0到(m-1)+(n-1)
  2. 根据k的奇偶性确定遍历方向
    • k为偶数:从下往上遍历(行索引递减,列索引递增)
    • k为奇数:从上往下遍历(行索引递增,列索引递减)
  3. 确定每条对角线的起始点
    • 当k < min(m, n)时,起始点在矩阵边缘
    • 当k ≥ min(m, n)时,起始点向矩阵内部移动

代码实现

class Solution {public int[] findDiagonalOrder(int[][] mat) {if (mat == null || mat.length == 0) return new int[0];int m = mat.length;int n = mat[0].length;int[] result = new int[m * n];int index = 0;// 遍历所有对角线(k = i + j)for (int k = 0; k < m + n - 1; k++) {if (k % 2 == 0) { // 偶数对角线:从下往上// 确定起始点int i = Math.min(k, m - 1);int j = k - i;// 沿对角线向上遍历while (i >= 0 && j < n) {result[index++] = mat[i][j];i--;j++;}} else { // 奇数对角线:从上往下// 确定起始点int j = Math.min(k, n - 1);int i = k - j;// 沿对角线向下遍历while (j >= 0 && i < m) {result[index++] = mat[i][j];i++;j--;}}}return result;}
}

算法解析

关键步骤详解

在这里插入图片描述

边界处理技巧

  1. 起始点确定
    • 偶数对角线:i = min(k, m-1), j = k - i
    • 奇数对角线:j = min(k, n-1), i = k - j
  2. 遍历终止条件
    • 当行索引或列索引超出矩阵边界时停止
  3. 方向切换
    • 利用k的奇偶性自然切换方向

复杂度分析

指标说明
时间复杂度O(m*n)每个元素访问一次
空间复杂度O(1)除结果数组外无额外空间
遍历效率100%最优解

拓展思考

变体问题

  1. Z字形打印矩阵
  2. 螺旋矩阵遍历
  3. 对角线求和问题

总结

对角线遍历问题展示了如何通过观察矩阵的数学特性(行索引+列索引=常数)来设计高效算法。关键在于:

  1. 识别对角线遍历的数学规律
  2. 巧妙处理遍历方向的交替变化
  3. 精确控制边界条件
http://www.xdnf.cn/news/18807.html

相关文章:

  • CentOS 部署 Prometheus 并用 systemd 管理
  • Mistral AI音频大模型Voxtral解读
  • 初识神经网络——《深度学习入门:基于Python的理论与实现》
  • QT(1)
  • 【STM32】CubeMX(十二):FreeRTOS消息队列
  • THM Rabbit Hole
  • COREDUMP
  • Life:Internship in OnSea Day 64
  • java基础(十五)计算机网络
  • 利用matlab实现CST超表面阵列的自动建模
  • TCP和UDP的使用场景
  • onnx入门教程(四)——ONNX 模型的修改与调试
  • 借Copilot之力,实现办公效率的跃升
  • Flink 滑动窗口实战:从 KeyedProcessFunction 到 AggregateFunction WindowFunction 的完整旅程
  • 交换机是如何同时完成帧统计与 BER/FEC 分析的
  • leetcode LCR 012.寻找数组的中心下标
  • 59 C++ 现代C++编程艺术8-智能指针
  • IO多路转接(select方案)
  • 测试用例如何评审?
  • `mysql_query()` 数据库查询函数
  • 如何监控ElasticSearch的集群状态?
  • THM trypwnme2
  • 【广告系列】流量归因模型
  • LeetCode热题100--102. 二叉树的层序遍历--中等
  • 云计算学习笔记——Linux用户和组的归属权限管理、附加权限、ACL策略管理篇
  • CentOS安装Jenkins全流程指南
  • 【大白话解析】 OpenZeppelin 的 ECDSA 库:以太坊签名验证安全工具箱(附源代码)
  • 零基础也能写博客:cpolar简化Docsify远程发布流程
  • 自学嵌入式第二十七天:Linux系统编程-进程
  • MQTT 协议模型:客户端、 broker 与主题详解(二)