首页 > 其他分享 >【leetcode-数组】对角线遍历

【leetcode-数组】对角线遍历

时间:2023-03-23 15:02:46浏览次数:35  
标签:遍历 matrix 索引 int else ++ 对角线 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-数组】对角线遍历_i++


标签:遍历,matrix,索引,int,else,++,对角线,leetcode
From: https://blog.51cto.com/u_6813689/6145095

相关文章

  • 【leetcode-字符串】翻转字符串里的单词
    题目:给定一个字符串,逐个翻转字符串中的每个单词。 示例1:输入:"theskyisblue"输出: "blueisskythe"示例2:输入:" helloworld! "输出: "world!hello"......
  • 【leetcode-数组】长度最小的子数组
    题目:给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回0。示例: 输入:s=7......
  • 【leetcode-数组】最大连续1的个数
    题目:给定一个二进制数组,计算其中最大连续1的个数。示例1:输入:[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续1,所以最大连续1的个数是3.注意:输入的数组......
  • leetcode-设置交集大小至少为2
    题目:一个整数区间[a,b](a<b)代表着从a到b的所有连续整数,包括a和b。给你一组整数区间intervals,请找到一个最小的集合S,使得S里的元素与区间intervals中的每......
  • 每日一题-leetcode 单值二叉树
    如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回false。示例1:输入:[1,1,1,1,1,null,1]输出:true示例2:输......
  • 【leetcode-链表】两两交换链表中的节点
    题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例:1->2->3->42->1->4->3思路:首先需要建......
  • 【leetcode-动态规划】斐波那契数
    题目:斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,  F(1) =1F(N)=......
  • 每日一题-leetcode 环绕字符串中唯一的子字符串
    把字符串s看作是 “abcdefghijklmnopqrstuvwxyz” 的无限环绕字符串,所以 s看起来是这样的:“…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…”.现......
  • 软著帮手-遍历项目中所有的文件输出项目所有的代码以及代码行数
    packagecom.example.demo;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;publicclassTest{staticintcount=0;pu......
  • vue3中如何通过遍历传入组件名称动态创建多个component 组件
    背景在vue3中,如果使用component,可以动态加载一个组件,例如<!--直接创建--><component:is="Image"/>这样会将已经定义好并导入的比如Image组件加载出来,但......