持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
一、题目与题目分析
题目
给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
(题目来源:力扣: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中)
主要代码
整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)
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;
}
}
三、结果展示
四、人生总结
疫情过后,很多人可能改变了;但希望你仍是那时的少年。
题目数据库
Gitee:传送门
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)