当前位置: 首页 > news >正文

外语教学网站开发广州计算机软件公司排名

外语教学网站开发,广州计算机软件公司排名,我做网站如何分流客户,开发一个软件的流程文章目录摘要描述题解答案题解代码分析代码解析示例测试及结果时间复杂度空间复杂度总结摘要 这篇文章带你用 Swift 实战一道非常经典的 DFS 记忆化搜索题目 —— LeetCode 329《矩阵中的最长递增路径》。看似一个简单的“走格子”游戏,实则考察了搜索顺序、剪枝策…

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码解析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这篇文章带你用 Swift 实战一道非常经典的 DFS + 记忆化搜索题目 —— LeetCode 329《矩阵中的最长递增路径》。看似一个简单的“走格子”游戏,实则考察了搜索顺序、剪枝策略和状态缓存等一系列算法技巧。我们将一步步分析这道题的解决过程,并附上可运行的 Swift 代码及详细注释。

描述

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能对角线 方向上移动或移动到 边界外(即不允许环绕)。

示例 1:

输入: matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出: 4 
解释: 最长递增路径为 [1, 2, 6, 9]。

示例 2:

输入: matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出: 4 
解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

示例 3:

输入: matrix = [[1]]
输出: 1

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • 0 <= matrix[i][j] <= 231 - 1

题解答案

我们可以用 深度优先搜索(DFS)+ 记忆化搜索(Memoization) 来解决这个问题:

  1. 对每个格子 (i, j) 进行 DFS,尝试向四个方向扩展路径;
  2. 每当发现下一个格子数字更大,就继续递归搜索;
  3. 为了避免重复计算,我们使用一个二维数组 cache[i][j] 存储每个格子的最长路径长度;
  4. 所有格子的 DFS 跑一遍,返回最长的路径长度即可。

题解代码分析

import Foundationclass Solution {func longestIncreasingPath(_ matrix: [[Int]]) -> Int {guard !matrix.isEmpty else { return 0 }let m = matrix.countlet n = matrix[0].countvar cache = Array(repeating: Array(repeating: 0, count: n), count: m)let directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]func dfs(_ x: Int, _ y: Int) -> Int {if cache[x][y] != 0 {return cache[x][y]}var maxLength = 1for (dx, dy) in directions {let newX = x + dxlet newY = y + dyif newX >= 0, newX < m, newY >= 0, newY < n,matrix[newX][newY] > matrix[x][y] {maxLength = max(maxLength, dfs(newX, newY) + 1)}}cache[x][y] = maxLengthreturn maxLength}var result = 0for i in 0..<m {for j in 0..<n {result = max(result, dfs(i, j))}}return result}
}

代码解析

  • cache[x][y]:用于记录格子 (x, y) 的最长路径长度,避免重复递归;
  • dfs 是递归核心函数,它探索每一个可能的方向;
  • directions 列出四个方向(上、下、左、右);
  • 最后遍历整个矩阵,取所有位置 DFS 的最大值作为结果。

示例测试及结果

我们可以写一个简单的测试模块,验证这个函数的效果:

let solution = Solution()let matrix1 = [[9, 9, 4],[6, 6, 8],[2, 1, 1]
]
print(solution.longestIncreasingPath(matrix1))  // 输出: 4let matrix2 = [[3, 4, 5],[3, 2, 6],[2, 2, 1]
]
print(solution.longestIncreasingPath(matrix2))  // 输出: 4let matrix3 = [[1]
]
print(solution.longestIncreasingPath(matrix3))  // 输出: 1

运行结果为:

4
4
1

可以看到,函数能准确输出矩阵中最长递增路径的长度。

时间复杂度

  • O(m × n):每个格子只会被访问一次,因为有缓存机制(记忆化搜索)。
  • 对于矩阵中每个格子 (i, j),我们最多做 4 次方向判断,但不会重复递归。

空间复杂度

  • O(m × n):我们使用了一个 cache 二维数组来保存每个格子的搜索结果;
  • 递归栈的深度最坏为 m × n,不过大部分情况下都远小于这个上限。

总结

这道题看起来像暴力 DFS,但只要引入记忆化搜索(Memoization),效率就大幅提升,避免了重复计算。也体现了典型的“搜索+缓存”优化套路。

如果你在刷题中遇到「在图中找最长路径」的问题,不妨第一时间考虑:

  • 是否可以 DFS 解决?
  • 子问题结果能不能缓存?

这个技巧在图搜索、DP、树结构中经常用到,是刷题的通关利器。

http://www.dtcms.com/a/578601.html

相关文章:

  • 主流开源视觉语言模型(VLM)的视觉编码器架构解析
  • SGV3D:面向基于视觉的路边3D目标检测的场景泛化
  • 实现 json path 来评估函数式解析器的损耗
  • 微网站分销linux做网站哪个版本好
  • 解决Git 冲突后本地提交丢失/未推送问题
  • 企业做网站建设遇到的问题合肥长丰路网站建设
  • 【剑斩OFFER】算法的暴力美学——最小覆盖字串
  • 全屏网站模板制作教程国外网站需要备案吗
  • 免费做网站有哪些家SaaS网站可以做seo嘛
  • 14:C++:二叉搜索树
  • 「日拱一码」142 Lasso调参注意事项与技巧
  • 【OTA专题】1 OTA加密升级总览
  • 针对编程面试和算法题的基础书籍
  • 10.大模型Agent介绍与应用
  • 兵团建设环保局门户网站中交通力建设股份有限公司网站
  • seo网站程序手机网站生成app客户端
  • 做旅游网站的论文wordpress公告模板
  • 博客登陆wordpress廊坊企业网站排名优化
  • 【LLaVA-NeXT】请问,这种“auto分配”的行为具体是哪一个库的API实现的呢
  • Riverpod框架内部实现原理剖析
  • 图解Redis面试篇
  • 网站首页设计风格wap网站源码下载
  • 获取泛型信息及获取注解信息
  • 会展免费网站模板网站优化课程
  • 【赵渝强老师】Redis数据的迁移
  • Rust编程学习 - 为什么说Cow 代表的是Copy-On-Write, 即“写时复制技术”,它是一种高效的 资源管理手段
  • Rust开发完全指南:从入门到与Python高效融合
  • 石家庄免费建站模板我不想找之前做网站的续费
  • 商城网站模板 免费五个跨境电商平台
  • 无人设备遥控器之数字图传技术