力扣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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具