leetcode 498. 对角线遍历 中等
给你一个大小为 m x n
的矩阵 mat
,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,4,7,5,3,6,8,9]
示例 2:
输入:mat = [[1,2],[3,4]] 输出:[1,2,3,4]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 10^4
1 <= m * n <= 10^4
-10^5 <= mat[i][j] <= 10^5
分析:直接模拟。由于矩阵的大小不会很大,可以额外用一个数组标记位置是否已经遍历过。
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* findDiagonalOrder(int** mat, int matSize, int* matColSize, int* returnSize) {int n=matSize,m=matColSize[0],f=0,t=0;*returnSize=m*n;int flag[n+5][m+5];for(int i=0;i<n;++i)for(int j=0;j<m;++j)flag[i][j]=0;int *ans=(int*)malloc(sizeof(int)*(m*n));for(int i=0,j=0;t<m*n;){if(!f){while(i>=0&&j<m&&flag[i][j]==0){ans[t++]=mat[i][j],flag[i][j]=1;i--,j++;}f=1;i++;j=fmin(m-1,j);}else{while(i<n&&j>=0&&flag[i][j]==0){ans[t++]=mat[i][j],flag[i][j]=1;i++,j--;}f=0;j++;i=fmin(n-1,i);}}return ans;
}