【LeetCode - 每日1题】求网格最长V形对角线段的长度
🌈 个人主页:(时光煮雨)
🔥 高质量专栏:vulnhub靶机渗透测试
👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~)
🌵目录🌵
- 难度 ⭐⭐⭐⭐⭐
- 前言
- ✅ 题目回顾
-
- 🎯 任务目标:
- ✅ 示例分析
-
- ✅ 示例 1
- ✅ 示例 2
- ✅ 示例 3
- ✅ 示例 4
- ✅ 解题思路
-
- 🍒 核心逻辑
- ✅ 代码实现
- ✅ 代码说明
- ✅ 复杂度分析
- ✅ 测试用例验证
-
- ✅ 示例 1
- ✅ 示例 2
- ✅ 示例 3
- ✅ 示例 4
- ✅ 总结
- 🤝 期待与你共同进步
- 📚 参考文档
难度 ⭐⭐⭐⭐⭐
前言
欢迎阅读本篇题解!本文将详细解析如何寻找网格中最长的"V对角线"路径。该问题要求我们在网格中找到由交替的1和2组成的路径,路径只能沿对角线方向移动,且最多只能右转一次。这是一个具有挑战性的网格路径搜索问题,需要高效地探索所有可能路径。我们将使用深度优先搜索(DFS)结合记忆化技术来优化解决方案。
✅ 题目回顾
🎯 任务目标:
给定一个二维网格 grid,其中每个单元格的值为1或2。找到最长的"V对角线"路径,该路径满足:
- 从值为1的单元格开始。
- 路径上的值交替出现(1后必须是2,2后必须是1)。
- 路径只能沿对角线方向移动(四个方向:右下、左下、左上、右上)。
- 路径在移动过程中最多只能右转一次(改变方向一次)。
返回最长路径的长度。
✅ 示例分析
✅ 示例 1
输入:grid = [[2,2,1,2,2],[2,0,2,2,0],[2,0,1,1,0],[1,0,2,2,2],[2,0,0,2,2]]
输出:3
解释:从网格中的某个1开始,可以找到长度为3的路径,例如从(0,2)开始,向右下移动到(1,3)值为2,然后继续向右下或右转。
✅ 示例 2
输入:grid = [[2,2,2,2,2],[2,0,2,2,0],[2,0,1,1,0],[1,0,2,2,2],[2,0,0,2,2]]
输出:3
解释:类似示例1,存在长度为3的路径。
✅ 示例 3
输入:grid = [[1,2,2,2,2],[2,2,2,2,0],[2,0,0,0,0],[0,0,2,2,2],[2,0,0,2,0]]
输出:1
解释:没有更长的路径,只有起点本身。
✅ 示例 4
输入:grid = [[1]]
输出:1
解释:只有一个单元格,路径长度为1。
✅ 解题思路
🍒 核心逻辑
为了解决这个问题,我们需要遍历网格中的每个单元格作为起点,但只有值为1的单元格才能作为起点。对于每个起点,我们尝试四个初始方向,然后使用DFS来探索路径。在DFS过程中,我们检查下一个单元格是否在网格内且值是否符合预期(交替的1或2)。我们允许直行或右转(如果还没有右转过),并记录路径长度。使用记忆化来避免重复计算相同状态。
关键点:
- 状态包括当前坐标、方向、是否还可以右转、以及下一个目标值。
- 方向有四个,使用方向向量表示移动。
- 目标值交替:当前值为1时,下一个目标值为2;当前值为2时,下一个目标值为1。代码中使用3 - target来实现交替。
✅ 代码实现
from functools import cache
from typing import Listclass Solution:def lenOfVDiagonal(self, grid: List[List[int]]) -> int:DIRS = ((1, 1), (1, -1), (-1, -1), (-1, 1))m, n = len(grid), len(grid[0])