leetcode498-对角线遍历

这是一个Z字形编排问题,JEPG的编码过程中也会用到。

原题

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

示例:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ] ] 输出: [1,2,4,7,5,3,6,8,9] 解释:
leetcode498-对角线遍历

说明:

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

解法

思想

找拐点的规律:

  1. 当横坐标x为0,纵坐标y是偶数,且y不是最后一列的时候,拐点向右。
  2. 当横坐标x为最后一行,若行数为偶数且纵坐标y为奇数或行数为奇数但纵坐标y为偶数时,拐点向右。
  3. 当纵坐标y为0,横坐标x是奇数,且x不是最后一行的时候,拐点向下。
  4. 当纵坐标y为最后一列,若列数为偶数且横坐标x为偶数或列数为奇数但横坐标x为奇数时,拐点向右。
  5. 其他情况,当横坐标x为偶数且纵坐标y为奇数或x为奇数且y为偶数的时候,拐点向左下
  6. 当横坐标x为偶数且纵坐标y为偶数或x为奇数且y为奇数的时候,拐点向右上

代码

class Solution {
    public int[] findDiagonalOrder(int[][] matrix) {
        //获取二维数组的长宽、大小
        int x = matrix.length;
        if(x == 0) return new int[0];
        int y = matrix[0].length;
        int size = x*y;

        int x_now=0,y_now=0;//落点位置
        int[] ret = new int[size];//用于存储并返回的一维数组
        int i = 0;
        while( x_now < x && y_now < y ){
            ret[i] = matrix[x_now][y_now]; //存入元素
            i++;
            if((x_now==0&&y_now%2==0&&y_now!=y-1)||(x_now == x-1&&(y_now+x)%2==0)){//向右
                y_now += 1;
            }else if((y_now==0&&x_now%2==1&&x_now!=x-1)||(y_now == y-1&&(x_now+y)%2==1)){//向下
                x_now += 1;
            }
            else if((x_now+y_now)%2==0){//向右上
                y_now +=1;
                x_now -=1;
            }else if((x_now+y_now)%2==1){//向左下
                y_now -=1;
                x_now +=1;
            }
        }
        return ret;
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode498-%e5%af%b9%e8%a7%92%e7%ba%bf%e9%81%8d%e5%8e%86/

(0)
彭晨涛彭晨涛管理者
上一篇 2019年11月13日
下一篇 2019年11月15日

相关推荐

  • leetcode530-二叉搜索树的最小绝对差

    原题 给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值。 示例: 输入:    1    &n…

    算法 2020年2月22日
    01330
  • leetcode71-简化路径

    原题 以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..…

    算法 2020年1月23日
    090
  • leetcode836-矩形重叠

    原题 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。 如果相交的面积为正,则称两矩形重叠。需要…

    算法 2020年3月18日
    0450
  • leetcode239-滑动窗口最大值

    原题 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最…

    算法 2020年4月21日
    0180
  • leetcode79-单词搜索

    原题 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格…

    算法 2020年4月12日
    0130
  • 剑指offer47-礼物的最大价值

    原题(来源Leetcode) 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一…

    算法 2020年6月12日
    090
  • 程序员面试金典01.07-旋转矩阵

    原题(来源Leetcode) 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到? 示例 …

    算法 2020年4月7日
    0410
  • leetcode116-填充每个节点的下一个右侧节点指针

    原题 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {   int val;  &…

    2020年1月14日
    0530
  • leetcode403-青蛙过河

    原题 一只青蛙想要过河。 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有)。 青蛙可以跳上石头,但是不可以跳入水中。 给定石子的位置列表(用单…

    算法 2020年6月16日
    04590
  • 剑指offer17-打印从1到最大的n位数

    原题(来源Leetcode) 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: …

    算法 2020年4月17日
    080

发表回复

登录后才能评论