【题目概要】
498. 对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
【思路分析】
- 先计算总共需要循环几次,row+col-1,然后如何分开每一次的方向,以及在遍历的过程中出现范围越界处理方式,共有几种越界方式?
【代码示例】
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findDiagonalOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
if(matrixSize == 0)
{
*returnSize = 0;
return 0;
}
int *re = NULL;
if(matrixSize > 0)
{
*returnSize = matrixSize * *matrixColSize;
re = (int*)malloc(sizeof(int) * *returnSize);
int count = matrixSize + *matrixColSize - 1;
int m = 0;
int n = 0;
int j = 0;
//循环的次数,行列之和-1
for(int i=0; i<count; i++)
{
//分成两种情况,偶数次和奇数次
if(i % 2 == 0)
{
while(m >= 0 && n < *matrixColSize)
{
re[j++] = matrix[m--][n++];
}
if(n < *matrixColSize)
{
m++;
}
else
{
m += 2;
n -= 1;
}
}
else
{
while(n >=0 && m < matrixSize)
{
re[j++] = matrix[m++][n--];
}
if(m < matrixSize)
{
n++;
}
else
{
m -= 1;
n += 2;
}
}
}
}
return re;
}