题目
给定一个含有 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;
}
网友评论