LeetCode: 498. Diagonal Traverse

30 篇文章 0 订阅
1 篇文章 0 订阅

Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.

Example:

Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output:  [1,2,4,7,5,3,6,8,9]
Explanation:

Note:

  1. The total number of elements of the given matrix will not exceed 10,000.

题意:蛇形打印矩阵。
分析:按照主对角线打印,主对角线的特点是i+j=固定值,而且i和j每次只能变1,因此有:
1)斜向上:i–; j++;
2)斜向下:i++; j–;
注意判断溢出情况。
代码如下:

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        if(matrix==null||matrix.length==0)
            return new int[]{};
        int n=matrix.length;
        int m=matrix[0].length;
        int[] result=new int[n*m];
        int i=0;
        int j=0;
        int k=1;
        for(int index=0;index<n*m;index++){
            result[index]=matrix[i][j];
            int di,dj;
            if(k>0){//向上
                di=i-1;
                dj=j+1;
            }
            else{//向下
                di=i+1;
                dj=j-1;
            }
            if(di>=0&&di<n&&dj>=0&&dj<m)//没有溢出
            {
                i=di;
                j=dj;
            }
            else{
                if(k>0){//向上
                    if(j+1<m)//上溢出,仍然可以向右,右回头
                        j++;
                    else//右溢出,仍然可以向下,下回头
                        i++;
                }
                else{//向下
                    if(i+1<n)//左溢出
                        i++;
                    else//下溢出
                        j++;
                }
                k=k*-1;
            }
        }
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值