• 498. Diagonal Traverse


    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:
    

    Note:

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

    public int[] findDiagonalOrder(int[][] matrix) {
    if (matrix == null || matrix.length == 0) return new int[0];
    
    int row = 0, col = 0, pos = 0, m = matrix.length, n=matrix[0].length, output [] = new int[m * n];
    
    for (pos = 0; pos < m * n; pos++) {
        output[pos] = matrix[row][col];
    
        if ((row + col) % 2 == 0) {
            // The direction is always up when the sum of row & col is even
            
            // For last column, go down
            if (col == n-1) { row++; }                
            
            // For first row & non-last columns, go right
            else if (row == 0) { col++; }
            
            // For not first row & non-last columns, go up and to the right
            else { row--; col++; }
    
        } else {
            // The direction is always down when the sum of row & col is odd
    
            // For last row, go right
            if (row == m-1) { col++; } 
            
            //  For non-last row & first column, go down
            else if (col == 0) { row++; }
            
            // For non-last row & non-first column, go down and to the left
            else { row++; col--; }
        }
    }

    https://leetcode.com/problems/diagonal-traverse/discuss/97711/Java-15-lines-without-using-boolean

    通过观察发现 i + j % 2 == 0时是往右上走,其中有两个边界条件,1.到最右列时要往下走,2. 在第一行时往右, 3.一般情况,向右上走

    i + j % 2 != 0时往坐下走,也有两个边界条件,1. 到最后一行时往右走,2. 在第一列时往下走,3.一般情况,往左下走

    下面还有为什么先判断行/列边界条件,而且if else语句顺序不能变

    you will get IndexOutBound Error. The reason is following:
    there will be a situation when we satisfy both these two statements, in case i, it is at right top corner, in this case, we can only goes down -- thus it has to first goto "col == n-1" check. Otherwise if goes to "row == 0" check we will have indexOutOfBound error since we can't do col++;

    Similarly, there will be a situation when we satisfy both these two statements, in case ii, it is at left bottom corner, in this case, we can only goes right --it has to first goto "row == m-1" check, Otherwise if goes to "col == 0" check we will have indexOutOfBound error since we can't do row++;

  • 相关阅读:
    转 MySQL权限管理
    mysql 驱动问题
    mysql issue:
    (五)容器网络 -上
    idea 快速生成代码的快捷键
    (四)容器互联
    (三)将容器变成镜像
    (二)docker的部署安装,配置,基础命令
    (一)为什么要学习docker
    Centos7 安装docker ce
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13190808.html
Copyright © 2020-2023  润新知