力扣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 }

 

posted on 2022-04-22 11:36  我不想一直当菜鸟  阅读(115)  评论(0编辑  收藏  举报