博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 498:对角线遍历Diagonal Traverse(python3、java)
阅读量:6124 次
发布时间:2019-06-21

本文共 2508 字,大约阅读时间需要 8 分钟。

对角线遍历

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

Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
示例:

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

解释:

在这里插入图片描述

说明:

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

思路

​ 实例输入的二维数组范围均是0~2

​ 先观察一下遍历规律:(0,0)->(0,1)->(1,0)->(2,0)->(1,1)->(0,2)->(1,2)->(2,1)->(2,2)

​ 数组索引(m,n),两种改变方式1、(m-1,n+1) 2、(m+1,n-1)

​ 数组从(0,0)开始,先是(m-1,n+1) ,(0,0)->(-1,1)此时m=-1,超出范围,m赋值0。然后切换索引改变方式(m+1,n-1),执行两次(0,1)->(1,0)->(2,-1),n赋值0得到(2,0),再次切换为索引改变方式(m-1,n+1)直到下次超出范围(2,0)->(1,1)->(0,2)->(-1,3)。此时m<0且n>2均超出范围,(m+2,n-1),应当优先判断n是否超出范围,执行(m+2,n-1)->(1,2),避免因为m<0再次切换一次索引改变方式。然后正常切换后:(1,2)->(2,1)->(3,0),因为m>2,切换方式并(m-1,n+2)

java:

class Solution {    public int[] findDiagonalOrder(int[][] matrix) {        if (matrix.length==0||matrix[0].length==0)return new int[0];        int col=matrix.length,row=matrix[0].length;        int nums=col*row,m=0,n=0;        int res[]=new int[nums];        boolean flag=true;        for(int i=0;i
=col){ m-=1; n+=2; flag=true; }else if(n>=row){ n-=1; m+=2; flag=false; } if(m<0){ m=0; flag=false; }else if(n<0){ n=0; flag=true; } } return res; }}

注意点:

if (matrix.length==0||matrix[0].length==0)return new int[0];首先判断是否为空数组,另外 matrix.length==0||matrix[0].length==0 判断条件顺序不能颠倒,因为如果 matrix.length==0 后面的 matrix[0].length==0 不会再判断,即返回空数组;但是matrix[0].length==0 在前时,如果输入数组为空,matrix[0] 会报错因为matrix并没有0号索引。

​ for循环里应当先判断m、n是否大于或等于各自的最大长度,然后执行(m-1,n+2)、(m+2,n-1)。避免出现m、n同时小于0时flag布尔值转换两次的错误。

python:

class Solution:    def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]:        if(len(matrix)==0 or len(matrix[0])==0):            return []        col=len(matrix)        row=len(matrix[0])        nums=col*row        m=n=0        flag=True        res=[]        for i in range(nums):            res.append(matrix[m][n])            if flag:                m-=1                n+=1            else:                m+=1                n-=1            if m>=col:                m-=1                n+=2                flag=True            elif n>=row:                m+=2                n-=1                flag=False            if m<0:                m=0                flag=False            elif n<0:                n=0                flag=True        return res

在这里插入图片描述

转载于:https://www.cnblogs.com/zhangzhe532/p/10979358.html

你可能感兴趣的文章
ajax请求拿到多条数据拼接显示在页面中
查看>>
小程序: 查看正在写的页面
查看>>
dedecms生成文档数据库崩溃 mysql daemon failed to start
查看>>
Linux的50个基本命令
查看>>
Objective-C中创建单例方法的步骤
查看>>
Codeforces 520B:Two Buttons(思维,好题)
查看>>
Jenkins持续集成环境部署
查看>>
emoji等表情符号存mysql的方法
查看>>
检查磁盘利用率并且定期发送告警邮件
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
linux文本模式和文本替换功能
查看>>
Windows SFTP 的安装
查看>>
摄像机与绕任意轴旋转
查看>>
rsync 服务器配置过程
查看>>
预处理、const与sizeof相关面试题
查看>>
爬虫豆瓣top250项目-开发文档
查看>>
Elasticsearch增删改查
查看>>
oracle归档日志增长过快处理方法
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>