【leetcode-数组】对角线遍历

题目:

给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

 

示例:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

输出:  [1,2,4,7,5,3,6,8,9]

解释:

 

说明:

  1. 给定矩阵中的元素总数不会超过 100000 。

思路:

观察规律, 利用每层的索引和相等

假设矩阵无限大
索引和为{偶}数,从左向上遍历,{横}索引值递减,列索引值递增,遍历值依次是(x,0),(x-1,1),(x-2,2),…,(0,x)
索引和为{奇}数,从右向下遍历,{纵}索引值递减,横索引值递增,遍历值依次是(0,y),(1,y-1),(2,y-2),…,(y,0)
0:              (00)
1:            (01)(10)
2:          (20)(11)(02)
3:        (03)(12)(21)(30)
4:      (40)(31)(22)(13)(04)
5:    (05)(14)(23)(32)(41)(50)
6:  (60)(51).........  .......(06) 

java代码:

class Solution {
     public int[] findDiagonalOrder(int[][] matrix) {
        if (matrix == null) {
            return null;
        }
        if(matrix.length ==0) {
            return new int[0];
        }

        int m = matrix.length;
        int n = matrix[0].length;

        int[] res = new int[m * n];

        int i = 0;
        int j = 0;
        for (int l = 0; l < m * n; l++) {
            res[l] = matrix[i][j];
            if ((i + j) % 2 == 0) {//从左往上遍历
                if(j==n-1) {//走到了列的最右边,行往下移一格 准备右往下遍历
                    i++;
                }else if(i==0) { //走到了行的最上边,列往右移一格 准备右往下遍历
                    j++;
                }else {
                    i--;
                    j++;
                }
            }else {//从右往下遍历
                if(i==m-1) {  //走到了行的最下边,列往右移一格 准备左往上遍历
                    j++;
                }else if(j==0) {//走到了列的最左边,行往下移一格 准备左往上遍历
                    i++;
                }else {
                    i++;
                    j--;
                }
            }

        }

        return res;
    }
}

 

由于水平有限,文章中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!

及时更新最新文章和学习资料,一起来学习:

推荐阅读:

【leetcode-字符串】二进制求和

【leetcode-数组】买卖股票的最佳时机 II  - CSDN博客

【leetcode-数组】加一  - CSDN博客

【leetcode-数组】 旋转数组  - CSDN博客

【leetcode-数组】移动零  - CSDN博客

【leetcode-数组】两个数组的交集 II  - CSDN博客

【leetcode】搜索旋转排序数组  - CSDN博客

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值