首页 > 其他 > 详细

对角线遍历

时间:2020-04-14 18:25:14      阅读:81      评论:0      收藏:0      [点我收藏+]

题目:对角线遍历

问题描述:

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

解决思路:

技术分享图片
根据上面的图我们可以得到如下信息:

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

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

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

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

解决代码:


class Solution {
    public static int[] findDiagonalOrder(int[][] matrix) {
        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;
    }
}

对角线遍历

原文:https://www.cnblogs.com/syhyfh/p/12699447.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!