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

快速排名网站怎么做多语言网站

快速排名网站,怎么做多语言网站,网站外包价格 北京网站制作公司,老山网站建设Problem: 498. 对角线遍历 文章目录整体思路完整代码时空复杂度时间复杂度:O(M * N)空间复杂度:O(1) (不考虑输出数组)整体思路 这段代码旨在解决一个二维矩阵的遍历问题:对角线遍历 (Diagonal Traverse)。它要求按照 “Z” 字形或 “蛇形”…

Problem: 498. 对角线遍历

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(M * N)
    • 空间复杂度:O(1) (不考虑输出数组)

整体思路

这段代码旨在解决一个二维矩阵的遍历问题:对角线遍历 (Diagonal Traverse)。它要求按照 “Z” 字形或 “蛇形” 的顺序遍历一个 m x n 的矩阵,并将所有元素按此顺序存入一个一维数组中。

该算法采用了一种 模拟(Simulation) 的方法,直接根据规则模拟遍历的路径。它不依赖于复杂的数据结构,而是通过维护当前位置 (i, j) 和一个方向标志 f 来控制整个遍历过程。

其核心逻辑步骤如下:

  1. 状态维护

    • i, j: 当前在矩阵中的行和列索引。
    • f: 一个方向标志。代码中使用 f = 1 代表向右上(行索引减小,列索引增大)移动,f = -1 代表向左下(行索引增大,列索引减小)移动。
    • k: 一个从 0m*n - 1 的循环变量,确保每个元素都被访问且仅被访问一次。
  2. 主循环与遍历

    • 算法通过一个 for 循环,总共迭代 m * n 次,对应矩阵中的每一个元素。
    • 在每次循环的开始,首先将当前位置 mat[i][j] 的值存入结果数组 ans
    • 然后,算法的核心任务是计算出下一个 (i, j) 的位置。
  3. 移动与边界处理逻辑

    • 尝试常规移动:首先,根据当前方向 f 计算出下一个“理想”位置 (ni, nj)
      • 如果 f=1 (右上),则 ni = i - 1, nj = j + 1
      • 如果 f=-1 (左下),则 ni = i + 1, nj = j - 1
    • 判断是否越界:接下来是最关键的部分——判断 (ni, nj) 是否超出了矩阵的边界。
      • 如果未越界ninj 都在 [0, m-1][0, n-1] 的有效范围内,那么直接更新 i = ni, j = nj,完成一步移动。
      • 如果越界:这说明遍历的路径已经撞到了矩阵的边缘,此时需要改变方向并找到下一条对角线的起点。
        • 撞到上或右边界 (右上移动时)ni < 0 (上) 或 nj == n (右)。
          • 此时必须改变方向,f = -f
          • 确定“拐点”:如果撞到的是右边界 (nj == n),则下一个位置在当前行的下一行 i++。如果撞到的是上边界 (ni < 0),则下一个位置在当前列的下一列 j++
        • 撞到下或左边界 (左下移动时)ni == m (下) 或 nj < 0 (左)。
          • 同样改变方向,f = -f
          • 确定“拐点”:如果撞到的是下边界 (ni == m),则下一个位置在当前列的下一列 j++。如果撞到的是左边界 (nj < 0),则下一个位置在当前行的下一行 i++

通过这种“尝试移动 -> 检查边界 -> 若越界则拐弯并变向”的循环,算法精确地模拟了对角线遍历的完整路径。

完整代码

class Solution {/*** 对一个 m x n 的矩阵进行对角线遍历。* @param mat 输入的二维矩阵* @return 按对角线遍历顺序的一维数组*/public int[] findDiagonalOrder(int[][] mat) {// f: 方向标志。1 表示向右上移动,-1 表示向左下移动。int f = 1;int m = mat.length;int n = mat[0].length;// i, j: 当前在矩阵中的行和列索引int i = 0;int j = 0;// ans: 存储最终结果的一维数组int[] ans = new int[m * n];// 循环 m * n 次,确保遍历所有元素for (int k = 0; k < m * n; k++) {// 1. 将当前位置的元素存入结果数组ans[k] = mat[i][j];// 2. 计算下一个理论位置 (ni, nj)// 如果 f=1, (i-1, j+1); 如果 f=-1, (i+1, j-1)int ni = i - f;int nj = j + f;// 3. 边界检查与移动逻辑// A. 处理向上或向右越界的情况 (发生在 f=1, 即右上移动时)if (ni < 0 || nj == n) {// 撞到右边界 (nj == n),拐点在下一行if (nj == n) {i++;} else { // 撞到上边界 (ni < 0),拐点在下一列j++;}// 改变方向,准备向左下移动f = -f;// B. 处理向下或向左越界的情况 (发生在 f=-1, 即左下移动时)} else if (nj < 0 || ni == m) {// 撞到下边界 (ni == m),拐点在下一列if (ni == m) {j++;} else { // 撞到左边界 (nj < 0),拐点在下一行i++;}// 改变方向,准备向右上移动f = -f;// C. 正常情况:没有越界} else {// 直接移动到计算出的下一个位置i = ni;j = nj;}}return ans;}
}

时空复杂度

时间复杂度:O(M * N)

  1. 循环:算法的核心是一个 for 循环,该循环从 k = 0m * n - 1,总共执行 M * N 次,其中 M 是矩阵的行数,N 是列数。
  2. 循环内部操作
    • 在循环的每一次迭代中,执行的都是常数时间的操作:数组读写、算术运算、条件判断和变量赋值。
    • 所有这些操作的时间复杂度都是 O(1)

综合分析
总的时间复杂度是循环次数乘以单次循环的开销,即 (M * N) * O(1) = O(M * N)。算法需要访问矩阵中的每一个元素一次。

空间复杂度:O(1) (不考虑输出数组)

  1. 主要存储开销
    • int[] ans = new int[m * n]: 这个数组是用来存储输出结果的,其大小为 M * N。在算法复杂度分析的通常约定中,返回结果所需的空间不计入额外辅助空间
    • 其他变量:f, m, n, i, j, k, ni, nj 都是基本类型的变量,只占用固定的、常数级别的空间。

综合分析
如果我们不考虑输出数组 ans 的空间,那么算法本身只使用了常数个变量。因此,其额外辅助空间复杂度为 O(1)。如果必须将输出数组也计算在内,则空间复杂度为 O(M * N)。

http://www.dtcms.com/a/585987.html

相关文章:

  • 墨境 | 水墨风动作Roguelite游戏
  • 深度学习:python人脸表情识别系统 情绪识别系统 深度学习 神经网络CNN算法 ✅
  • Similarity and Dissimilarity Measures|相似性和不相似性度量
  • 树莓派学习资料共享
  • 我们来学AI编程 -- 深入分析Lingma后台程序
  • Rootkit检测利器rkhunter详解:原理、实践与渗透测试应用
  • 济南制作网站公司哪家好鱼鱼cms
  • 专门做自助游攻略的网站是哪个济南品牌网站建设价格低
  • 网站开发设计创建一个餐饮公司的模板
  • Go语言爬虫:支持xpath解析的 htmlquery 库的详细使用
  • Redisson解锁失败,watchdog会不会一直续期下去?
  • 网站建设的单可以刷吗产品网站开发流程
  • 51-基于单片机的多功能油烟机控制系统设计与实现
  • 简述企业网站的建设流程购物网站 功能
  • Git分支上游追踪完全解析:git branch -u与--set-upstream-to用法精讲
  • 【BuildFlow 筑流】Duration.rs 文件实现详解
  • Canal实时同步MySQL数据到Elasticsearch
  • Python 操作 Elasticsearch
  • 微网站建设找哪家公司好中国网站备案取消
  • AI Agent设计模式 Day 3:Self-Ask模式:自我提问驱动的推理链
  • RAG论文阅读笔记
  • 网站建设优化推广修改wordpress数据库域名
  • 西安成品网站建设临沂最新消息
  • 影视网站搭建技术大纲
  • 多粒子模型-简单化学反应1
  • 基于Springboot的影视推荐系统的设计与实现371d749h(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
  • 网站设计与制作说明书应聘网站优化的简历怎么做
  • 网站项目云主机玩游戏怎么样
  • 什么是PMOS?什么是NMOS?两者有什么区别?
  • Selective Kernel Networks (SKNet)