对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:
说明:
给定矩阵中的元素总数不会超过 100000 。
思路:
当横纵下标之和为偶数时,遍历方向为左下到右上,为奇数时相反。再对四种情况进行合并,不需要写四个分支,以横纵下标之和为奇数时为例。
if(row==matrixSize-1) column++;
else{
row++;
if(column) column--;
}
另外需要注意当输入为空时,以下语句将出现执行错误。
*returnSize=matrixSize*(*matrixColSize);
需要写成
if(matrixSize==0){
*returnSize=0;
return 0;
}
代码:
int* findDiagonalOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
if(matrixSize==0){
*returnSize=0;
return 0;
}
int row=0,column=0,k=0;
*returnSize=matrixSize*(*matrixColSize);
int* res=malloc(*returnSize * sizeof(int));
while(k<*returnSize){
res[k]=matrix[row][column];
if((row+column)%2){
if(row==matrixSize-1) column++;
else{
row++;
if(column) column--;
}
}
else{
if(column==*matrixColSize-1) row++;
else{
column++;
if(row) row--;
}
}
k++;
}
return res;
}