对角线遍历

题目:对角线遍历

问题描述:

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

解决思路:


根据上面的图我们可以得到如下信息:

1、遍历的方向有两个:先是"右上"方向,然后是"左下"方向,然后再是"右上"方向,再是"左下"方向... ...

2、遍历有4种临界情况:当继续向下遍历的元素的行或列小于0时(分别对应于元素1和元素4的情况);当继续向下遍历的元素的行或列超出数组的行或列时(分别对应于元素8和元素3的情况)。并且应当注意当发生这种临界情况时,遍历的方向也会发生相应的变化。

有了以上的信息,我们就可以定义一个二维数组tran来表示遍历的方向,它的两个值就分别代表"右上"和"左下"。

再定义一个变量k来负责控制遍历方向的变化,一旦发生上面所说临界情况中的一种,就改变遍历方向。

解决代码:


class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if(matrix == null || matrix.length == 0) {
            return new int[]{};
        }
        
        int rowNum = matrix.length;
        int colNum = matrix[0].length;
        int[] arr = new int[rowNum * colNum];
        int[][] tran = {{-1, 1}, {1, -1}};
        int k = 0;
        int row = 0;
        int col = 0;
        for(int i = 0; i < arr.length; i++) {
            arr[i] = matrix[row][col];
            row += tran[k][0];
            col += tran[k][1];

            // 临界情况
            if(row > rowNum - 1) {
                row = rowNum - 1;
                col += 2;     // 在进入该代码块之前col已经减去了1,所以为了达到col+1的效果,我们需要将col加2
                k = 1 - k;    // 变化遍历方向
            }

            if(col > colNum - 1) {
                col = colNum - 1;
                row += 2;    // 在进入该代码块之前row已经减去了1,所以为了达到row+1的效果,我们需要将row加2
                k = 1 - k;
            }

            if(row < 0) {
                row = 0;
                k = 1 - k;
            }

            if(col < 0) {
                col = 0;
                k = 1 - k;
            }
        }
        return arr;
    }
}

posted @ 2020-04-14 17:30  samsaraaa  阅读(304)  评论(0)    收藏  举报