题目:

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

 

示例:


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

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

解释:


 

说明:

  1. 给定矩阵中的元素总数不会超过 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-数组】对角线遍历_字符串