【JAVA】【刷题子】498.对角线遍历

329 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

一、题目与题目分析

题目

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

题目分析

  题目很明确也很清晰,就是用对角线的方式进行遍历。

二、整体逻辑与主要代码

题目分析已经比较清楚了,接下来我们进入代码设计。

整体逻辑

  在参考题解的分析后,也知道了这个对角线的规律(奇数的趟数是怎么走;偶数的趟数是怎么走)。我们又是以坐标系的方式来解题。原点是(0,0),即二维数组里的第一个一位数组的第一个数。
  在示例1中对应的坐标系就是:
1,2,3 => (0,0), (0,1), (0,2)
4,5,6 => (1,0), (1,1), (1,2)
7,8,9 => (2,0), (2,1), (2,2)
  因此,答案对应的坐标系对角线遍历就是:
1,2,4,7,5,3,6,8,9 => (0,0), (0,1), (1,0), (2,0), (1,1), (0,2), (1,2), (2,1), (2,2)
  主要就是用坐标系去解这个对角线遍历了,具体可根据主要代码(注释)来进行一起配合看吧~
  (参考题解: 【对角线遍历】 分析题目-找准规律-代码清晰易读-不要让自己迷失在随意的ifelse中)
image.png

主要代码

整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)

class Solution {
	public int[] findDiagonalOrder(int[][] mat) {
		if (mat == null || mat.length == 0) {
			return new int[] {};
		}
		// 坐标点(x,y) 坐标中心为第一个点(0,0),即第一个数
		int x = 0;
		int y = 0;
		// 坐标系,x轴长度
		int yLen = mat.length;
		// 坐标系,y轴长度
		int xLen = mat[0].length;
		// 定义一共有多少个点
		int[] points = new int[yLen * xLen];
		for (int i = 0; i < points.length; i++) {
			// 对角线排序(记录点的值)
			points[i] = mat[y][x];
			// (y + x) 为遍历的层数,趟数是奇数向下遍历,偶数向上遍历
			// 第 1 3 5 ... 趟(奇数)
			if ((y + x) % 2 == 0) {
				if (x == xLen - 1) {
					// 向右边走到头了,往下走(y轴)
					y++;
				} else if (y == 0) {
					// 往右走(x轴)
					x++;
				} else {
					// 由左下角向右上角移动
					x++;
					y--;
				}

			} else {
				// 第 2 4 6 ... 趟(偶数)
				if (y == yLen - 1) {
					// 向下走到头了,往右走(x轴)
					x++;
				} else if (x == 0) {
					// 往下走(y轴)
					y++;
				} else {
					// 由右上角向左角下移动
					x--;
					y++;
				}
			}
		}
		return points;
	}
}

三、结果展示

image.png

四、人生总结

疫情过后,很多人可能改变了;但希望你仍是那时的少年。

题目数据库

Gitee:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)