首页 > 其他分享 >498.对角线遍历(中)

498.对角线遍历(中)

时间:2024-03-29 09:58:09浏览次数:18  
标签:碰到 遍历 matrix -- direction len 498 对角线 mat

目录

题目

法一、模拟

  • 分析由二维数组的特性可以得知,向右上方走实际上等于 x -= 1, y += 1, 向左下方走实际上等于 x+= 1, y -= 1

当向右上方走的时候,有两种情况会造成碰壁,因而需要转弯,
CASE 1: 碰到上方的壁 (x无法再 - 1),但还没碰到右方的壁(y可以 +1)
在这种情况下,下一步的坐标为 y += 1, 比如图里的 1 --> 2
CASE 2: 碰到右方的壁 (y无法再 +1)
在这种情况下, 下一步的坐标为 x += 1, 比如图里的 3 --> 6
向左下方走同理:
CASE 1: 碰到左方的壁 (y无法再 -1), 但还没有碰到下方的壁(x可以 +1)
在这种情况下,下一步的坐标为 x += 1, 比如图里的 4 --> 7
CSSE 2: 碰到下方的壁 (x无法再 +1)
在这种情况下,下一步的坐标为 y += 1, 比如图里的 8 --> 9

class Solution:
	def findDiagonalOrder(self, matrix):
		if not matrix or not matrix[0]:
			return []
		M, N = len(matrix), len(matrix[0])
		matrix_num = M * N
		count = 0
		x, y = 0, 0
		result = []
		direction = "up"
		while (count < matrix_num):
			count += 1
			result.append(matrix[x][y])
			# 向右上方向走
			if direction == "up":
				# 无需调换方向的条件(1.x>0 碰到上壁前, 2.y<n-1碰到右壁前)
				if x > 0 and y < N - 1:
					x -= 1
					y += 1
					continue
				else:
					direction = "down"
					# 碰到上壁:1 --> 2
					if x == 0 and y < N - 1:
						y += 1
					# 碰到右壁:3 --> 6
					elif y == N - 1:
						x += 1
			# 向左下方向走
			else:
				# 无需调换方向的条件(1.x < M 碰到下壁前, 2.y > 0 碰到右壁前)
				if x < M - 1 and y > 0:
					x += 1
					y -= 1
					continue
				else:
					direction = "up"
					# 碰左壁:4 --> 7
					if  y == 0 and x < M - 1:
						x += 1
					# 碰下壁:8 --> 9
					elif x == M - 1 :
						y += 1
		return result

法二、不等式

  • 一共有m+n−1m + n - 1m+n−1个对角线,对应左上角贴边走到右下角;右斜对角线是横纵坐标和为定值(左斜的话是差为定值)。
class Solution:
    def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
        m, n, ans = len(mat), len(mat[0]), []
        for k in range(m + n - 1):
            if not k % 2:
                ans += [mat[x][k-x] for x in range(min(m - 1, k), max(-1, k - n),-1)]
            else:
                ans += [mat[x][k-x] for x in range(max(0, k - n + 1), min(k + 1, m))]
        return ans

标签:碰到,遍历,matrix,--,direction,len,498,对角线,mat
From: https://www.cnblogs.com/lushuang55/p/18103097

相关文章

  • day10:字典的循环遍历及序列操作
    一、字典的循环遍历1.遍历字典的键dict1={'name':'张三','age':20,'gender':'男'}forkeyindict1.keys():print(key)#name#age#gender2.遍历字典的值dict1={'name':'张三','age':20,'......
  • Day51:WEB攻防-前后台功能点&文件下载&文件读取&文件删除&目录遍历&目录穿越
    目录文件安全-下载&读取&删除-案例黑白盒下载=读取文件删除目录安全-遍历&穿越-案例黑白盒目录遍历目录穿越知识点:1、文件安全-前后台功能点-下载&读取&删除2、目录安全-前后台功能点-目录遍历&目录穿越文件安全-下载&读取&删除-案例黑白盒1、下载=读取......
  • 【华为OD机试真题】C卷-二叉树的广度优先遍历(JAVA)
    一、题目描述【华为OD机试真题】C卷-二叉树的广度优先遍历(JAVA)题目描述:有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出层序遍历的结果。二、输入输出输入......
  • 889. 根据前序和后序遍历构造二叉树
    给定两个整数数组,preorder和postorder,其中preorder是一个具有无重复值的二叉树的前序遍历,postorder是同一棵树的后序遍历,重构并返回二叉树。如果存在多个答案,您可以返回其中任何一个。https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-postorde......
  • 洛谷P1443 马的遍历(bfs模版题)
    洛谷P1443马的遍历https://www.luogu.com.cn/problem/P1443一道经典的bfs入门题这里贴上代码//#defineLOCAL1#define_CRT_SECURE_NO_WARNINGS1#include<bits/stdc++.h>//#defineintlonglong#defineendl"\n";usingnamespacestd;constintmaxn=500;intG......
  • 洛谷题单指南-图的基本应用-P3916 图的遍历
    原题链接:https://www.luogu.com.cn/problem/P3916题意解读:寻找每个点所能到达的最大的点。解题思路:直观上,可以依次从每个点开始DFS搜索,记录经过的最大点,复杂度是O(n^2)级别,会超时。可以换一种角度,既然要找每个点可以达到的最大值,那么可以反向建图,从最大值出发,所经过的点能达到......
  • html中table如何在td中画对角线
    在HTML中,要在<td>单元格中绘制对角线,可以使用CSS样式。具体做法是在<td>元素中添加一个<div>元素,并使用CSS的::before伪元素来创建对角线。代码如下:<tdstyle="width:3%"class="diagonal-line"><div></div></td>在这个例子中,.diagonal-line 类被应用到包含文本的<......
  • js数组遍历方法及应用,看这篇就够了
    背景:日常开发中处理数组常用到的遍历方法,看这篇就够了目录数组遍历方法forforEachfor...ofmapfilterfor...inreduce求和、求积数组去重计算数组中每个元素出现的次数将二维数组转化为一维将多维数组转化为一维对象里的属性求和按对象属性给数组分组简单对比数组......
  • 属性遍历那些事儿:从入门到精通,笑谈间掌握技巧
    1.属性的分类普通属性原型属性不可枚举属性Symbol属性静态属性??我们先来看看下面这个对象。constsymbolIsAnimal=Symbol.for("pro_symbol_attr_isAnimal");constsymbolSay=Symbol.for("pro_symbol_method_say");constsymbolSalary=Symbol.for("ins_symbol_a......
  • leetcode106从中序与后序遍历序列构造二叉树
    目录1.解题关键2.思路3.变量名缩写与英文单词对应关系4.算法思路图解5.代码本文针对原链接题解的比较晦涩的地方重新进行说明解释原题解链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/solutions/50561/tu-jie-gou-z......