博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
按照对角线的方式遍历矩阵 Diagonal Traverse
阅读量:5943 次
发布时间:2019-06-19

本文共 1963 字,大约阅读时间需要 6 分钟。

  hot3.png

问题:

Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.

Example:

Input:

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

 

10003729_kVOC.png

Note:

  1. The total number of elements of the given matrix will not exceed 10,000.

 解决:

① 

移动的方向不再是水平或竖直方向,而是对角线方向,那么每移动一次,横纵坐标都要变化,向右上移动的话要坐标加上[-1, 1],向左下移动的话要坐标加上[1, -1],那么难点在于我们如何处理越界情况,越界后遍历的方向怎么变换。

向右上和左下两个对角线方向遍历的时候都会有越界的可能,但是除了左下角和右上角的位置越界需要改变两个坐标之外,其余的越界只需要改变一个。

那么我们就先判断要同时改变两个坐标的越界情况,即在右上角和左下角的位置。如果在右上角位置还要往右上走时,那么要移动到它下面的位置的,那么如果col超过了n-1的范围,那么col重置为n-1,并且row自增2,然后改变遍历的方向。同理如果row超过了m-1的范围,那么row重置为m-1,并且col自增2,然后改变遍历的方向。然后我们再来判断一般的越界情况,如果row小于0,那么row重置0,然后改变遍历的方向。同理如果col小于0,那么col重置0,然后改变遍历的方向。

class Solution { //10ms

    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[]{};
        int m = matrix.length;
        int n = matrix[0].length;
        int row = 0;
        int col = 0;
        int k = 0;
        int[] res = new int[m * n];
        int[][] dirs = {
{-1,1},{1,-1}};
        for (int i = 0;i < m * n;i ++){
            res[i] = matrix[row][col];
            row += dirs[k][0];
            col += dirs[k][1];
            if (row >= m){
                row = m - 1;
                col += 2;
                k = 1 - k;
            }
            if (col >= n){
                col = n - 1;
                row += 2;
                k = 1 - k;
            }
            if (row < 0){
                row = 0;
                k = 1 - k;
            }
            if (col < 0){
                col = 0;
                k = 1 - k;
            }
        }
        return res;
    }
}

② 根据横纵坐标之和的奇偶性来判断遍历的方向,然后对于越界情况再单独处理即可。

class Solution { //8ms

    public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[]{};
        int m = matrix.length;
        int n = matrix[0].length;
        int row = 0;
        int col = 0;
        int[] res = new int[m * n];
        for (int i = 0;i < m * n;i ++){
            res[i] = matrix[row][col];
            if ((row + col) % 2 == 0){
                if (col == n - 1){
                    row ++;
                }else if (row == 0){
                    col ++;
                }else {
                    row --;
                    col ++;
                }
            }else{
                if (row == m - 1) {
                    col++;
                }else if (col == 0){
                    row ++;
                }else {
                    row ++;
                    col --;
                }
            }
        }
        return res;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1603740

你可能感兴趣的文章
XenServer中License的设置对各种操作的影响
查看>>
mesos-dns & marathon-lb
查看>>
工作随笔之nginx 应用场景
查看>>
排序算法之选择排序
查看>>
typedef函数指针用法
查看>>
iOS开发之观察者模式初探
查看>>
官方文档
查看>>
multiple Rational objects
查看>>
学习,从这一刻开始
查看>>
55:Mysql用户管理|常用sql语句|mysql数据库备份恢复
查看>>
java WebSocket实现一对一消息和广播消息Demo
查看>>
Confluence 6 数据库结构图
查看>>
我的友情链接
查看>>
Docker命令查询
查看>>
Impala使用笔记(一)
查看>>
Epoll
查看>>
mkdir 命令
查看>>
Oracle Study之--PL/SQL Developer软件错误
查看>>
消息中间件-Activemq之Broker-Cluster
查看>>
JavaScript箭头函数(Arrow Function)
查看>>