美文网首页算法练习
对角线遍历(LeetCode 498)

对角线遍历(LeetCode 498)

作者: 倚剑赏雪 | 来源:发表于2020-03-12 21:17 被阅读0次

    题目

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

    输入:
    [
    [ 1, 2, 3 ],
    [ 4, 5, 6 ],
    [ 7, 8, 9 ]
    ]

    输出: [1,2,4,7,5,3,6,8,9]

    解释:

    说明:

    给定矩阵中的元素总数不会超过 100000 。
    

    解析

    • 观察得到规律:遍历的层数(行和列),偶数层向上遍历,奇数层向下遍历
    • 注意边界值:
      • 行和列的和是偶数的话首先判断右边界,如果到达右边界直接行向下移动一格,如果不是右边界,再判断是不是上边界,是的话列向右移动一格
      • 行和列的和是奇数的话首先判断下边界,如果到达下边界直接列向右移动一格,如果不是下边界,再判断是不是左边界,是的话行向下移动一格

    代码

     public int[] FindDiagonalOrder(int[][] matrix)
            {
                if (matrix.Length == 0 || matrix[0].Length == 0) return null;
                int row = matrix.Length;
                int col = matrix[0].Length;
                int[] resOrder = new int[row*col];
                int r = 0, c = 0;
                for (int i = 0; i < resOrder.Length; i++)
                {
                    resOrder[i] = matrix[r][c];
                    //r+c是遍历的层数,偶数层向上遍历,奇数层向下遍历
                    if ((r + c) % 2 == 0)
                    {
                        if (c == col - 1) r++;     //先判断是否到达右边界,到达右边界直接向下一格
                        else if (r == 0) c++;      // 再判断是否是上边界,是的话向右移动一格
                        else
                        {
                            //否则向上和向右
                            r--;
                            c++;
                        }
                    }
                    else
                    {
                        if (r == row-1) c++;        //先判断是否到达下边界,到达下边界直接向右一格
                        else if (c == 0) r++;       // 再判断是否是左边界,是的话向下移动一格
                        else
                        {
                            //否则向下和向左
                            r++;
                            c--;
                        }
                    }
                }
    
                return resOrder;
            }
    

    相关文章

      网友评论

        本文标题:对角线遍历(LeetCode 498)

        本文链接:https://www.haomeiwen.com/subject/hcxgjhtx.html