动态规划(二)三角矩阵(Triangle)、路径总数(Unique Paths)、路径总数2(Unique Paths II)

文章讨论了如何通过编程解决两个问题:在一个三角矩阵中找到从顶部到底部的最小路径和,以及计算机器人在给定地图上的不同路径总数。提供了两种方法(动态规划)的代码实现,适用于IT技术特别是算法和数据结构的学习者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    • 三角矩阵(Triangle)
  • 路径总数(Unique Paths)

  • 路径总数2(Unique Paths II)

  • 最小路径和(Minimum Path Sum)

三角矩阵(Triangle)


  • 题目描述:

链接:https://www.nowcoder.com/questionTerminal/2b7995aa4f7949d99674d975489cb7da

来源:牛客网

给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,

例如,给出的三角形如下:

[[2],[3,4],[6,5,7],[4,1,8,3]]

最小的从顶部到底部的路径和是2 + 3 + 5 + 1 = 11。

  • 解题思路

在这里插入图片描述

  • 方法一代码

/**

  • 三角矩阵

  • @param triangle

  • @return

*/

public int minimumTotal(ArrayList<ArrayList> triangle) {

if (triangle == null) return 0;

if (triangle.isEmpty()) return 0;

if (triangle.size() == 1) return triangle.get(0).get(0); //只有一行数据的时候

//row表示行

for (int row = 1; row < triangle.size(); row++) {

//col表示列

for (int col = 0; col < triangle.get(row).size(); col++) {

if (col == 0) {

//第一个, 直接加上一行第一个就行

triangle.get(row).set(col, triangle.get(row - 1).get(0) + triangle.get(row).get(0));

} else if (col == row) {

//每一行最后一个数据

triangle.get(row).set(col, triangle.get(row - 1).get(row - 1) + triangle.get(row).get(col));

} else {

triangle.get(row).set(col, Math.min(triangle.get(row - 1).get(col - 1), triangle.get(row - 1).get(col))

  • triangle.get(row).get(col));

}

}

}

//返回最后一行的最小的那个数字

ArrayList numList = triangle.get(triangle.size() - 1);

int ret = numList.get(0);

for (int i = 1; i < numList.size(); i++) {

ret = Math.min(ret, numList.get(i));

}

return ret;

}

  • 方法二代码

public int minimumTotal2(ArrayList<ArrayList> triangle) {

if (triangle == null) return 0;

if (triangle.isEmpty()) return 0;

if (triangle.size() == 1) return triangle.get(0).get(0); //只有一行数据的时候

for (int row = triangle.size() - 1 - 1; row >= 0; row–) {

for (int col = 0; col < row + 1; col++) {

triangle.get(row).set(col, Math.min(triangle.get(row + 1).get(col), triangle.get(row + 1).get(col + 1))

  • triangle.get(row).get(col));

}

}

return triangle.get(0).get(0);

}

路径总数(Unique Paths)


  • 问题描述

链接:https://www.nowcoder.com/questionTerminal/166eaff8439d4cd898e3ba933fbc6358

来源:牛客网

一个机器人在m×n大小的地图的左上角(起点,下图中的标记“start"的位置)。

机器人每次向下或向右移动。机器人要到达地图的右下角。(终点,下图中的标记“Finish"的位置)。

可以有多少种不同的路径从起点走到终点?

在这里插入图片描述

上图是3×7大小的地图,有多少不同的路径?

备注:m和n小于等于100

  • 解题思路

在这里插入图片描述

  • 代码

/**

  • 路径总数(Unique Paths)

  • @param “m行数”

  • @param “n列数”

  • @return

*/

public int uniquePaths(int m, int n) {

if (m == 0 || n== 0) return 0;

//构建二维数组

int[][] answers = new int[m][n];

//将第一行和第一列初始化为1

for (int i = 0; i < n; i++) {

answers[0][i] = 1;

}

for (int i = 0; i < m; i++) {

answers[i][0] = 1;

}

//从第二行第二列开始动态计算

for (int row = 1; row < m; row++) {

for (int col = 1; col < n; col++) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-D1GZmwaX-1712405850245)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-xTnYp7wh-1712405850245)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值