| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> leetCode 120. 三角形最小路径和「中等」 -> 正文阅读 |
|
[数据结构与算法]leetCode 120. 三角形最小路径和「中等」 |
题目给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。 示例 1:
示例 2:
提示:
解答动态规划 思路:在本题中,给定的三角形的行数为 n ( triangle.size( ) ),并且第 i 行(从 0 开始编号)包含了 i+1 个数。如果将每一行的左端对齐,那么会形成一个等腰直角三角形,如下所示:
我们用 res[i][j] 表示从三角形顶部走到位置 (i, j) 的最小路径和。这里的位置 (i, j) 指的是三角形中第 i 行第 j 列(均从 0 开始编号)的位置。 由于每一步只能移动到下一行「相邻的节点」上,因此要想走到位置 (i, j),上一步就只能在位置 (i - 1, j - 1) 或者位置 (i - 1, j)。我们在这两个位置中选择一个路径和较小的来进行转移,状态转移方程为: res[i][j] = min(res[i?1][j?1], res[i?1][j]) + c[i][j] 其中 c[i][j] 表示位置 (i, j) 对应的元素值。 注意第 i?行有 i+1 个元素,它们对应的 j?的范围为 [0, i]。当 j=0 或 j=i?时,上述状态转移方程中有一些项是没有意义的。例如当 j=0 时,res[i-1][j-1] 没有意义,因此状态转移方程为: res[i][0] = res[i-1][0] + c[i][0] 即当我们在第 i?行的最左侧时,我们只能从第 i-1 行的最左侧移动过来。当 j=i 时,res[i-1][j] 没有意义,因此状态转移方程为: res[i][i] = res[i-1][i-1] + c[i][i] 即当我们在第 i 行的最右侧时,我们只能从第 i-1 行的最右侧移动过来。 最终的答案即为 res[n-1][0] 到 res[n-1][n-1] 中的最小值,其中 n?是三角形的行数。 状态转移方程的边界条件是什么?由于我们已经去除了所有「没有意义」的状态,因此边界条件可以定为: f[0][0] = c[0][0] 即在三角形的顶部时,最小路径和就等于对应位置的元素值。这样一来,我们从 1?开始递增地枚举 i,并在 [0, i] 的范围内递增地枚举 j,就可以完成所有状态的计算。
复杂度分析 时间复杂度:O(n^2),其中 n (size)?是三角形的行数。 空间复杂度:O(n^2)。我们需要一个? size * size? 的二维数组存放所有的状态。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:46:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |