1.问题:
给定一个大小为 m x n
的矩阵 mat
,以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素,如下图所示:
2.思路:
根据题目,在第一次遍历时,可以发现,其坐标为(0,0),而往上遍历下一个时,坐标变为(-1,1),此时此坐标在矩阵中并不存在,因此开始第二个对角线的遍历,此时需要遍历的坐标变为(0,1),其下一个遍历的坐标为(1,0),而继续遍历时,遍历坐标为(2,-1),此时第二条对角线遍历结束,接下去的对角线遍历都可以此类推,至此,可以发现,第一条对角线,也即奇数次对角线遍历的坐标变化规律为行数-1,而列数+1,而偶数次对角线的变化规律为行数+1,列数-1
由此,便只需使用while循环,同时控制好边界跳出条件即可实现遍历。
3.C#实现:
public static int[] FindDiagonalOrder(int[][] mat)
{
int colLenth= mat[0].Length;
int rowLenth= mat.Length;
List<int> result = new();
int number = 0;// 对角线遍历次数
int col = 0;// 最近一次遍历到的列数
int row = 0;// 最近一次遍历到的行数
int total = colLenth + rowLenth - 1;// 总对角线数
while (number < total)
{
number++;
if (number%2==0)//偶数次遍历
{
while (row< rowLenth)
{
result.Add(mat[row][col]);
row++;
if (row >= rowLenth)
{
break;
}
col--;
if (col < 0)
{
col = 0;
break;
}
}
if (row >= rowLenth)
{
row = rowLenth - 1;
col++;
}
}
else// 奇数次遍历
{
while (col < colLenth)
{
result.Add(mat[row][col]);
col++;
if (col >= colLenth)
{
break;
}
row--;
if (row<0)
{
row = 0;
break;
}
}
if (col >= colLenth)
{
col = colLenth - 1;
row++;
}
}
}
return result.ToArray();
}