对角线遍历(LeetCode 498)

题目

给定一个含有 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;
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 5,809评论 0 2
  • 题目描述 给定一个含有 M x N 个元素的矩阵(M行,N列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角...
    鱼枕阅读 4,756评论 0 0
  • 数组中重复的数字(一维数组) 问题:在一个长度为长度为n的数组里的所有数字都在0-n-1之间。找出任意一个重复的数...
    Drama_Du阅读 4,847评论 0 0
  • 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历...
    饼干不干阅读 4,468评论 0 51
  • 这周有2次测试,着实下了个大马威。但是我发现自从有了分享以后,自己心态好了很多,考试之前没怎么预习,也没那么紧张...
    盘丝逸尘阅读 1,534评论 0 0