498. 对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
示例:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
说明:
给定矩阵中的元素总数不会超过 100000 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diagonal-traverse
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
注意:找规律,注意方向问题
class Solution {
public int[] findDiagonalOrder(int[][] matrix) {
if(matrix==null||matrix.length==0)
{
return new int[0];
}
int M=matrix.length;
int N=matrix[0].length;
int[] res=new int[M*N];
int row=0;
int column=0;
int direction=1;
int r=0;
while(row<M&&column<N)
{
res[r++]=matrix[row][column];//只要给定坐标还在数组中就将该坐标元素加入结果数组中
//两个坐标,一个加一,一个减一。
//direction为0,行数加一,列数减一得出的是左下角元素;
//direction为1,行数减一,列数加一得出的是右上角元素。
int new_row=row+(direction==1?-1:1);
int new_column=column+(direction==1?1:-1);
//判断新坐标是否还在数组内
if(new_row<0||new_row==M||new_column<0||new_column==N)
{
//若新坐标不在数组内,即到达边界
if(direction==1)
{
//向右找下一行对角线,如果列数没有到达本行的最后一位,则行数不变,列数加一
row+=(column==N-1?1:0);
column+=(column<N-1?1:0);
}
else
{
//向下找下一行对角线,如果行数没有到达本列的最后一位,则列数不变,行数加一
column+=(row==M-1?1:0);
row+=(row<M-1?1:0);
}
//到达边界后要改变方向
direction=1-direction;
}
else
{
//如果新坐标还在数组内,证明本行对角线还未读完,继续读即可
row=new_row;
column=new_column;
}
}
return res;
}
}