对角线遍历二维数组

2023-11-05

二维数组的应用(沿对角线循环遍历)

给定一个大小为 m x n 的矩阵 mat,以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。

在这里插入图片描述

(返回结果为:[1, 2, 4, 7, 5, 3, 6, 8, 9])

思路:将遍历过程分为两组,偶数次向右上遍历,奇数次向左下遍历。

方式一
// 将遍历过程分为三部分(左、中、右)
// 行小于列
int[][] mat = {
        {0, 1, 2, 0, 5},
        {3, 4, 5, 2, 1},
        {1, 3, 1, 5, 2}};
/*
  向右上遍历:
	左:counts[i] - j - 1, j
	中:m - j - 1, n - counts[i] + j
	右:m - j - 1, i - m + j + 1
  向左下遍历
	左:j, counts[i] - j - 1
	中:m - counts[i] + j, n - j - 1
	右:j, i - j
 */

// 行大于列
int[][] mat2 = {
        {0, 1, 2},
        {3, 4, 5},
        {1, 3, 1},
        {0, 5, 2},
        {5, 2, 1}};
/*
  向右上遍历:
	左:counts[i] - j - 1, j
	中:m - j - 1, n - counts[i] + j
	右:i - j, j
  向左下遍历
	左:j, counts[i] - j - 1
	中:m - counts[i] + j, n - j - 1
	右:i - n + j + 1, n - j - 1
 */

代码实现:

public static int[] findDiagonalOrder(int[][] mat) {
    if (mat.length == 0) {
        return new int[0];
    }
    int m = mat.length; // 行数
    int n = mat[0].length;  // 列数
    int[] result = new int[m * n];  // 存储结果

    int time = m + n - 1;   // 循环次数
    int[] counts = new int[time];   // 每次循环遍历元素个数
    int min = Math.min(m, n);

    int index = 0;  // 当前遍历数据的索引

    for (int i = 0; i < time; i++) {
        // 计算每次循环遍历元素个数
        if (i < min) {  // 左上部分
            counts[i] = i + 1;
        } else if (i >= time - min) {   // 中间部分
            counts[i] = time - i;
        } else {
            counts[i] = min;    // 右下部分
        }

        // 向上遍历
        if (i % 2 == 0) {
            for (int j = 0; j < counts[i]; j++) {
                if (i < min) {
                    result[index] = mat[counts[i] - j - 1][j];
                } else if (i >= time - min) {
                    result[index] = mat[m - j - 1][n - counts[i] + j];
                } else {
                    if (m <= n) {   // 行数小于等于列数
                        result[index] = mat[m - j - 1][i - m + j + 1];
                    } else {    // 行数大于列数
                        result[index] = mat[i - j][j];
                    }
                }
                index++;
            }
        } else {
            // 向下遍历
            for (int j = 0; j < counts[i]; j++) {
                if (i < min) {
                    result[index] = mat[j][counts[i] - j - 1];
                } else if (i >= time - min) {
                    result[index] = mat[m - counts[i] + j][n - j - 1];
                } else {
                    if (m <= n) {
                        result[index] = mat[j][i - j];
                    } else {
                        result[index] = mat[i - n + j + 1][n - j - 1];
                    }
                }
                index++;
            }
        }
    }
    return result;
}
方式二

思路:利用图形观察出数学代数关系和规律。

代码实现:

public static int[] findDiagonalOrder2(int[][] matrix) {
    if (matrix.length == 0) {
        return new int[0];
    }
    int m = matrix.length;
    int n = matrix[0].length;

    int[] result = new int[m * n];  // 存放数组
    int count = n + m - 1;  // 对角线方向次数
    int row = 0, col = 0, index = 0;    // 定义初始化 行标记,列标记,存放数组索引
    // 开始对角线循环
    for (int i = 0; i < count; i++) {
        //判断对角线方向:偶数右上,奇数左下
        if (i % 2 == 0) {
            // 右上操作
            while (row >= 0 && col < n) {
                result[index] = matrix[row][col];   // 将矩阵数存入存放数组
                index++;    // 索引后移
                // 右上规律:行减一,列加一
                row--;
                col++;
            }
            // 判断是否为越界情况:不越界正常行加一,越界行加二,列减一
            if (col < n) {
                row++;
            } else {
                row += 2;
                col--;
            }
        } else {  // 左下操作:按规律与右上相反即可
            while (row < m && col >= 0) {
                result[index] = matrix[row][col];
                index++;
                row++;
                col--;
            }
            if (row < m) {
                col++;

            } else {
                row--;
                col += 2;
            }
        }
    }
    return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对角线遍历二维数组 的相关文章

随机推荐

  • 教你快速搭建个人网站

    一 搭建环境 云主机 华为云 操作系统 centos 7 x 源码 GitHub wyt1215819315 autoplan 这是一个自动化的托管系统 目前支持网易云 bilibili 米游社原神签到 测试地址https auto old
  • vue项目在ie11 浏览器运行出现错误解决方法

    一 基础配置 vue cli 版本 5 0 1 配置 browserslistrc 文件 gt 1 last 2 versions not dead ie gt 10 2 配置vue config js 配置 transpileDepend
  • C++堆栈详解

    前言 我们经常听见一个概念 堆 heap 和栈 stack 其实在数据结构中也有同样的这两个概念 但是这和内存的堆栈是不一样的东西哦 本文也会说明他们之间的区别的 另外 本文的只是是以C C 为背景来说明 不同的语言在内存管理上面会有区别
  • java实现只能有一个相同用户登录的功能

    需求 使用相同用户名登录系统 确保同名用户登录顶掉之前用户登录或者返回登录的功能 实现效果图 java实现 首先 1 web xml中配置监听器
  • CMD 查杀端口详细

    1 netstat aon findstr pid 2 taskkill pid id f 杀死端口 注 pid 后面的pid 事 查询的进程id
  • 多元回归预测

    文章目录 效果一览 文章概述 部分源码 参考资料 效果一览 文章概述 多元回归预测 Matlab贝叶斯算法 bayes 优化随机森林的数据回归预测 bayes RF回归预测 多变量输入模型 评价指标包括 MAE RMSE和R2等 代码质量极
  • 工程(二)——DeeplabV3+语义分割训练自制数据集

    目录 1 配置环境 1 1 利用conda新建一个环境并激活 1 2 安装pytorch 1 3 更新bashrc环境 2 安装DeeplabV3 2 1 克隆代码 2 2 下载数据集和预训练模型 3 测试算法 4 制作VOC数据集 4 1
  • windows查看进程,以及是哪个功能启用当前的服务的

    windows查看进程 理论 实战 理论 查看进程启动的详细信息 1 tasklist v 2 wmic process get caption commandline value 可以获取进程启动的命令行参数信息等 获取具体某个信息 1
  • 将经纬度坐标在ArcGIS软件中生成系列矢量数据

    目录 环境介绍 操作内容 操作步骤 1 将经纬度坐标值编辑在excel中 注意x y对应的分别是经度和纬度 2 打开ArcMap软件 加载 xls数据 3 需要选择地理坐标系 4 点矢量数据生成 5 线矢量数据生成 6 面矢量数据生成 环境
  • 【HBZ分享】Mysql的binlog格式分类(STATEMENT, ROW, MIXED)

    STATEMENT格式 全名Statement Based Replication SBR 会记录每一条SQL语句 即SQL怎么写的 他就会怎么记录 无论更改多少行 该格式都不在乎 他只会记录SQL 优点 由于只记录sql 不会记录每一行变
  • 【转】Lwip 断连,连接几次后不通及偶尔不通的问题.

    https blog csdn net hecong kit article details 24415693 新加这个函数 并在tcp in函数里调用一下 出现不通的原因是在网络状态不流畅的情况下 连续连接N次后 LWIP默认不在连接 新
  • 保持ssh会话不掉线

    客户端 sudo vim etc ssh config 之类的文件名 添加 ServerAliveInterval 20 ServerAliveCountMax 9999 服务器端 sudo vim etc ssh sshd config
  • 解决问题:jinja2.exceptions.UndefinedError: ‘form‘ is undefined

    在flask开发的过程中 我遇到了题目上的报错 现放出自己的代码 login py login html 在运行过程中 网址显示 由此可见 login html中存在问题 在终端的报错中可以看到 最后一项报错为 为解决该问题 我在网上搜集了
  • ant-design table 表格头增加tooltip注释

    ant design table 表格头增加tooltip注释 注意屏蔽掉columns中的title属性才会有效果
  • 【一台服务器】【Web服务器】【DNS服务器配置】测试访问

    本次实验仅使用了一台服务器系统虚拟机 后续会在两台服务器系统虚拟机中进行 1 Windows Sever 2008 基本网络参数设置 如果不能解析域名 则需设置红框里面的DNS服务器地址 2 Web服务器网站设置 3 DNS服务器设置 3
  • 单元测试、集成测试、系统测试和验收测试、冒烟测试、回归测试、随机测试、探索性测试和安全测试

    单元测试 集成测试 系统测试和验收测试 冒烟测试 回归测试 随机测试 探索性测试和安全测试 前言 项目前期 中期至发布后测试启动前后我们一般要经历的几种测试方法 1 gt 单元测试 是指对软件中最小可测试单元进行检查和验证 单元测试当一段代
  • 软件测试的目的、原则及流程

    一 软件测试的目的 1 软件测试是为了发现错误而执行程序的过程 2 测试是为了证明程序有错 而不是证明程序无错 发现错误不是唯一目的 3 一个好的测试用例在于它发现至今未发现的错误 4 一个成功的测试是发现了至今未发现的错误的测试 注意 1
  • 做交互设计都有哪些需要掌握的思维方式

    由于目前的环境对这个细分领域仍然缺乏了解 我希望在这篇文章中写一些交互设计所需的思维方式 1 可用性优先 视觉靠边 一个功能个功能应该能够使用和使用 以便有人关心它是否好看 审美挑剔的用户实际上比你想象的要少得多 当然 这并不是说视觉设计并
  • 【cocos2d-x 3.x 学习笔记】 HelloWorld —— 小程序大道理

    cocos2d x 3 2 的环境搭建可以参考官方给出的教程 这里我使用的是 Win7 VS2013 1 创建项目 在Windows下搭建好环境后 打开命令行 按 Win R 输入cmd 执行下面命令 cocos new MyGame l
  • 对角线遍历二维数组

    二维数组的应用 沿对角线循环遍历 给定一个大小为 m x n 的矩阵 mat 以对角线遍历的顺序 用一个数组返回这个矩阵中的所有元素 返回结果为 1 2 4 7 5 3 6 8 9 思路 将遍历过程分为两组 偶数次向右上遍历 奇数次向左下遍