【leetcode-数组】对角线遍历

【leetcode-数组】对角线遍历

题目:

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

示例:

输入:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

输出: [1,2,4,7,5,3,6,8,9]

解释:

说明:

给定矩阵中的元素总数不会超过 100000 。
思路:
观察规律, 利用每层的索引和相等

假设矩阵无限大
索引和为{偶}数,从左向上遍历,{横}索引值递减,列索引值递增,遍历值依次是(x,0),(x-1,1),(x-2,2),…,(0,x)
索引和为{奇}数,从右向下遍历,{纵}索引值递减,横索引值递增,遍历值依次是(0,y),(1,y-1),(2,y-2),…,(y,0)

0:              (00)
1:            (01)(10)
2:          (20)(11)(02)
3:        (03)(12)(21)(30)
4:      (40)(31)(22)(13)(04)
5:    (05)(14)(23)(32)(41)(50)
6:  (60)(51).........  .......(06)

java代码:

class Solution {
     public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix == null) {
            return null;
        }
        if(matrix.length ==0) {
            return new int[0];
        }
 
        int m = matrix.length;
        int n = matrix[0].length;
 
        int[] res = new int[m * n];
 
        int i = 0;
        int j = 0;
        for (int l = 0; l < m * n; l++) {
            res[l] = matrix[i][j];
            if ((i + j) % 2 == 0) {//从左往上遍历
                if(j==n-1) {//走到了列的最右边,行往下移一格 准备右往下遍历
                    i++;
                }else if(i==0) { //走到了行的最上边,列往右移一格 准备右往下遍历
                    j++;
                }else {
                    i--;
                    j++;
                }
            }else {//从右往下遍历
                if(i==m-1) {  //走到了行的最下边,列往右移一格 准备左往上遍历
                    j++;
                }else if(j==0) {//走到了列的最左边,行往下移一格 准备左往上遍历
                    i++;
                }else {
                    i++;
                    j--;
                }
            }
 
        }
 
        return res;
    }
}

你可能感兴趣的:(【leetcode-数组】对角线遍历)