力扣498(java)-对角线遍历(中等)
题目:
给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。

输入:mat = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,4,7,5,3,6,8,9]
示例 2:
输入:mat = [[1,2],[3,4]]
输出:[1,2,3,4]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
-105 <= mat[i][j] <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diagonal-traverse
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:

找遍历过程的规律:
1.每一趟遍历的元素坐标之和 x+y是一次递增的;
2.每一趟都是x和y其中一个元素从小到大,另一个元素从大到小;
- 奇数趟:第三趟:(2,0),(1,1),(0,2),x从大到小,y从小到大;
- 偶数趟:第四趟:(0,3),(1,2),(2,1),x从小到大,y从大到小;
3.确定初始值
- 奇数趟:第五趟:(2,2),(1,3),x+y = 4,x从大到小(x 尽量取最大,当初始值超过 x 的上限时,不足的部分加到 y 上面)故x初始值取2,剩下的2,加到y上,y初始值为2;
- 偶数趟:第四趟:(0,3),(1,2),(2,1),x+y = 3,x从小到大,初始值取0,y从大到小,初始值取3;
4.确定结束值
- 奇数趟:第三趟:(2,0),(1,1),(0,2),x从大到小,y从小到大,结束的判断是, x 减到 0 或者 y 加到上限;
- 偶数趟:第四趟:(0,3),(1,2),(2,1),x从小到大,y从大到小,虽然y才减到1,但是x已经加到上限了;
5.注意:奇数趟 x 从大到小,那么偶数趟 y 从大到小,循环进行。 并且方向相反时,逻辑处理是一样的,除了x,y和他们各自的上限值是相反的。
- x 从大到小,第三趟:9 的坐标(2, 0),6 的坐标(1, 1),3 的坐标是(0,2)。x + y = 2,x 初始值取 2,y 取 0。结束值 x 减到 0 为止;
- x 从小到大,第四趟:4 的坐标(0, 3),7 的坐标(1, 2),10 的坐标(2, 1)。x + y = 3,y 初始值取 3,x 取 0。结束值 y 减到 0 为止;
代码:
1 class Solution {
2 public int[] findDiagonalOrder(int[][] mat) {
3 int m = mat.length;
4 int n = mat[0].length;
5 int[] res = new int[m*n];
6 int i = 0, k = 0;
7 while(i <= m+n-1){
8 //奇数趟:x从大到小,y从小到大
9 //定义初始值
10 int x1 = i < m ? i : m-1;
11 int y1 = i - x1;
12 while(x1 >= 0 && y1 <= n-1){
13 res[k] = mat[x1][y1];
14 k++;
15 x1--;
16 y1++;
17 }
18 i++;
19 //偶数趟:x从小到大,y从大到小
20 //定义初始值
21 int y2 = i < n ? i : n-1;
22 int x2 = i - y2;
23 while(x2 <= m-1 && y2 >=0) {
24 res[k] = mat[x2][y2];
25 k++;
26 x2++;
27 y2--;
28 }
29 i++;
30 }
31 return res;
32 }
33 }

力扣498(java)-对角线遍历(中等)的更多相关文章
- Leetcode 498:对角线遍历Diagonal Traverse(python3、java)
对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. Given a matrix of M x N elemen ...
- 498. (leetcode)对角线遍历
498. 对角线遍历 根据题目的图像看,主要有两种走法,第一种是向右上(顺时针方向),第二种是向左下(逆时针)走 我们设 x ,y初始为0,分别对应横纵坐标 现在分析右上(0,2) 为例:(注意右上的 ...
- Java实现 LeetCode 498 对角线遍历
498. 对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ ...
- LeetCode:对角线遍历【498】
LeetCode:对角线遍历[498] 题目描述 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- 刷题-力扣-107. 二叉树的层序遍历 II
107. 二叉树的层序遍历 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-level-order-tr ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- Leetcode 498.对角线遍历
对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, ...
- 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度
题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...
- 力扣1052. 爱生气的书店老板-C语言实现-中等难度
题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...
随机推荐
- 音频重采样48kk转16k
作为一个音频算法工程师,不懂重采样怎么可以呢?这里做一个常用的方法介绍: pcm转wav: ffmpeg -f s16le -ar 8000 -ac 2 -i out.pcm -ar 44100 -a ...
- c 语言默认什么编码
C语言是没有编码的.它的编码就是平台的默认编码.比方说在windows 上汉字编码用gb2312 或者 说cp936(GBK一般的windows默认代码页,windows分为不同的代码页,可以查看一下 ...
- 一个简易的ORM框架的实现(二)
框架目标 什么是框架,框架能做到什么? 把一个方向的技术研发做封装,具备通用性,让使用框架的开发者用起来很轻松. 属性: 通用性 健壮性 稳定性 扩展性 高性能 组件化 跨平台 从零开始-搭建框架 建 ...
- day09-Java数组
Java数组 9.稀疏数组 什么是稀疏数组? 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方式是: 记录数组一共有几行几列,有多少个不同的值 把具有 ...
- YUM以及yum源搭建
1 YUM简介 1.1 YUM简介 CentOS使用yum和dnf 解决rpm的包依赖关系. YUM:rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具,Ce ...
- .NET Core使用 CancellationToken 取消API请求
您是否曾经访问过一个网站,它需要很长时间加载,最终你敲击 F5 重新加载页面. 即使用户刷新了浏览器取消了原始请求,而对于服务器来说,API也不会知道它正在计算的值将在结束时被丢弃,刷新五次,服务器将 ...
- 数据结构-Hash常见操作实践
数据结构-Hash常见操作实践 目录介绍 01.什么是哈希算法 02.哈希算法的应用 03.安全加密的场景 04.唯一标识的场景 05.数据校验的场景 06.散列函数的场景 07.Git版本的控制 0 ...
- Phaser3 学习资料整理
新年新征程,今年开启H5小游戏. 接触过egret和layair,两位的工具链还是比较丰富的,但是我没能好好写出一个demo. 偶尔接触到Phaser,发现体验不错. 于是整理一些资料,方便自己和那些 ...
- .NET Emit 入门教程:第二部分:构建动态程序集(追加构建静态程序集教程)
前言: 在本部分中,我们将深入探讨如何使用C# Emit 来创建动态程序集. 动态程序集是在运行时生成的,为我们提供了一种灵活.动态地构建和加载程序集的能力. 1. 程序集的概念 程序集是.NET中的 ...
- 从静态到动态化,Python数据可视化中的Matplotlib和Seaborn
本文分享自华为云社区<Python数据可视化大揭秘:Matplotlib和Seaborn高效应用指南>,作者: 柠檬味拥抱. 安装Matplotlib和Seaborn 首先,确保你已经安装 ...