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日

相关推荐

  • leetcode57-插入区间

    原题 给出一个无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 示例 1: 输入: …

    算法 2020年5月12日
    0290
  • leetcode328-奇偶链表

    原题 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。 请尝试使用原地算法完成。你的算法的空…

    算法 2019年12月16日
    0130
  • leetcode1300-转变数组后最接近目标值的数组和

    原题 给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 targe…

    算法 2020年6月14日
    0990
  • leetcode344-反转字符串

    原题 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间…

    算法 2019年11月18日
    0150
  • 剑指offer64-求1+2+…+n

    原题(来源Leetcode) 求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 示例1…

    算法 2020年6月2日
    0690
  • leetcode452-用最少数量的箭引爆气球

    原题 https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/ 解法…

    算法 2024年3月27日
    0490
  • 剑指offer04-二维数组中的查找

    原题(来源Leetcode) 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个…

    算法 2020年4月4日
    0200
  • leetcode103-二叉树的锯齿形层次遍历

    原题 给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 例如:给定二叉树: [3,9,20,null,nul…

    算法 2020年1月25日
    060
  • leetcode54-螺旋矩阵

    原题 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6…

    算法 2019年11月15日
    0100
  • leetcode152-乘积最大子数组

    原题 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出:…

    算法 2020年5月18日
    0130

发表回复

登录后才能评论