前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode498、对角线遍历

LeetCode498、对角线遍历

作者头像
iiopsd
发布2022-12-23 08:49:33
4200
发布2022-12-23 08:49:33
举报
文章被收录于专栏:iiopsd技术专栏iiopsd技术专栏

给你一个大小为 m * 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 <= 104 1 <= m * n <= 104

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/diagonal-traverse 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

根据示例移动坐标值(y, x),找到调转方向的边界值,然后总结规律。 以一个4*3的矩阵示例(括号内代表x,y坐标值):4(x=3,y=0)

在这里插入图片描述
在这里插入图片描述
  1. 数组的大小等于m * n;
  2. 根据提议可以总结出遍历的坐标值列表为(xy): 00,10,01,02,11,20,30,21,12,22,31,32 加粗坐标为边界值,触发改变遍历方向
  3. 总结规律:
    • 向右上方遍历到第一行,或者最右边一列的时候,调转方向;
      • 如果不是最右边一列,就往右走一列;
      • 如果是最右边,就往下走一列。
    • 向左下方遍历到第一列,或者最下面一行的时候,调转方向;
      • 如果不是最下面一行,往下走一步;
      • 如果是最下面一行,就往右走一步。
    • 向右上方遍历没有触发边界值时,x++,y–;
    • 向左下方遍历没有触发边界值时,x–,y++;

参考代码如下:

代码语言:javascript
复制
class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int size = mat.length * mat[0].length;
        int[] res = new int[size];

        int x = 0;
        int y = 0;
        // 向右上方遍历
        boolean toRightUp = true;
        for (int i = 0; i < size; i++) {
			// System.out.println(x + ", " + y);
            res[i] = mat[y][x];
            // 当向右上方遍历到第一行,或者最右边一列的时候,调转方向
            if (toRightUp && (y == 0 || mat[0].length - 1 - x == 0)) {
                toRightUp = false;
                if (y == 0 && mat[0].length - 1 - x != 0) {
                    // 如果不是最右边一列,就往右走一列
                    x++;
                    continue;
                } else {
                    // 如果是最右边,就往下走一列
                    y++;
                    continue;
                }
            } else if (!toRightUp && (x == 0 || mat.length - 1 - y == 0)) {
                // 向左下方遍历到第一列,或者最下面一行的时候,调转方向
                toRightUp = true;
                if (x == 0 && mat.length - 1 - y != 0) {
                    // 如果不是最下面一行,往下走一步
                    y++;
                    continue;
                } else {
                    // 如果是最下面一行,就往右走一步
                    x++;
                    continue;
                }

            } else {
                if (toRightUp) {
                	// 向右上方遍历没有触发边界值时
                    x++;
                    y--;
                } else {
                	// 向左下方遍历没有触发边界值时
                    x--;
                    y++;
                }
            }
        }
        return res;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 给你一个大小为 m * n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
  • 解题思路:
  • 参考代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档