• [LeetCode] 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.

    对角线遍历。

    题意是给一个二维数组,按照规则遍历,输出一个一维数组。

    这个题没有什么算法,难点是如何判断到底是往上扫描还是往下扫描以及如何判断边界条件。

    首先发现如果是从左下往右上遍历,每个遍历到的点的横纵坐标的加和(x+y)% 2 == 0,比如1的坐标是(0,0),7的坐标是(0,2),5的坐标是(1,1);如果是从右上往左下遍历,遍历到的点的横纵坐标的加和(x+y)% 2 == 1,比如2的坐标(1,0),4的坐标(0,1)。这是一个仅限于这一题的结论。碰到边界条件只有两种可能,一是左下往右上走的时候确保纵坐标不要超出右边的边界和横坐标不要小于0;二是右上往左下走的时候确保横坐标不要大于矩阵的高和纵坐标不要超出左边的边界。

    时间O(mn)

    空间O(mn) - 存储output

    JavaScript实现

     1 /**
     2  * @param {number[][]} matrix
     3  * @return {number[]}
     4  */
     5 var findDiagonalOrder = function (matrix) {
     6     // corner case
     7     if (matrix.length === 0) {
     8         return [];
     9     }
    10 
    11     // normal case
    12     let row = 0;
    13     let col = 0;
    14     let m = matrix.length;
    15     let n = matrix[0].length;
    16     let res = [];
    17     for (let k = 0; k < m * n; k++) {
    18         res.push(matrix[row][col]);
    19         // moving up
    20         if ((row + col) % 2 === 0) {
    21             if (col === n - 1) {
    22                 row++;
    23             } else if (row === 0) {
    24                 col++;
    25             } else {
    26                 row--;
    27                 col++;
    28             }
    29         }
    30         // moving down
    31         else {
    32             if (row === m - 1) {
    33                 col++;
    34             } else if (col === 0) {
    35                 row++;
    36             } else {
    37                 row++;
    38                 col--;
    39             }
    40         }
    41     }
    42     return res;
    43 };

    Java实现

    注意一定要先写18行和27行否则会越界,因为往右上走的时候,先越界的一定是col;往左下走的时候,先越界的一定是row。

     1 class Solution {
     2     public int[] findDiagonalOrder(int[][] matrix) {
     3         // corner case
     4         if (matrix == null || matrix.length == 0) {
     5             return new int[0];
     6         }
     7 
     8         // normal case
     9         int row = 0;
    10         int col = 0;
    11         int m = matrix.length;
    12         int n = matrix[0].length;
    13         int[] res = new int[m * n];
    14         for (int i = 0; i < res.length; i++) {
    15             res[i] = matrix[row][col];
    16             // moving up
    17             if ((row + col) % 2 == 0) {
    18                 if (col == n - 1) {
    19                     row++;
    20                 } else if (row == 0) {
    21                     col++;
    22                 } else {
    23                     row--;
    24                     col++;
    25                 }
    26             } else {
    27                 if (row == m - 1) {
    28                     col++;
    29                 } else if (col == 0) {
    30                     row++;
    31                 } else {
    32                     row++;
    33                     col--;
    34                 }
    35             }
    36         }
    37         return res;
    38     }
    39 }

    LeetCode 题目总结

  • 相关阅读:
    加沙地带
    特拉维夫以色列第二大城市,滨临东地中海,以色列最为国际化的经济中心
    1980年,以色列国会立法确定耶路撒冷是该国“永远的与不可分割的首都”。而巴勒斯坦自治政府也宣布耶路撒冷将是未来巴勒斯坦国的首都。在21世纪,耶路撒冷仍然是巴以冲突的中心。
    delete
    NUnit -- Test discovery or execution might not work for this project
    HearthBuddy中_settings.txt的更详细参数解释
    WPF global exception handler
    sftp winscp
    cdn and fallback
    What happens in an async method
  • 原文地址:https://www.cnblogs.com/cnoodle/p/12381417.html
Copyright © 2020-2023  润新知