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

LeeCode120. 三角形最小路径和

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

示例 1:

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:23 46 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

示例 2:

输入:triangle = [[-10]]
输出:-10

提示:

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104

进阶:

  • 你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题吗?

答案:

#define DEFINE_FUNCTION_Min(fucName, returnType) \returnType fucName(returnType arg1, returnType arg2) { \returnType minVal = arg1 < arg2 ? arg1 : arg2; \return minVal; \}// 定义最小值函数
DEFINE_FUNCTION_Min(getIntMin, int)int minimumTotal(int** triangle, int triangleSize, int* triangleColSize) { // LeeCode 120.三角形最小路径和// 思考:假设最小路径和为f(x,y), 其中x表示行索引,y表示列索引,f(x,y) 为(x,y)索引处到达底部的最小路径和。// f(x,y) = triangle(x, j) +  min(f(x + 1, y) , f(x + 1, y + 1))// 需要倒着递推f(0,0)的值,从最后一行开始递推int** res = (int**)malloc(triangleSize * sizeof(int*));if (!res) return 0;for (int i = 0; i < triangleSize; i++) {res[i] = (int*)malloc(triangleColSize[i] * sizeof(int));if (!res[i]) return 0;// 清零//memset(res[i], 0, triangleColSize[i] * sizeof(int));}// 保存最后一行坐标的最小路径和for (int i = 0; i < triangleColSize[triangleSize - 1]; i++) {res[triangleSize - 1][i] = triangle[triangleSize - 1][i];}// 计算其他坐标最小路径和for (int i = triangleSize - 2; i >= 0; i--) {for (int j = 0; j < triangleColSize[i]; j++) {res[i][j] = triangle[i][j] + getIntMin(res[i + 1][j], res[i + 1][j + 1]);}}int resultVal = res[0][0];// 释放内存for (int i = 0; i < triangleSize; i++) {free(res[i]);}free(res);return resultVal;
}

测试代码:

void testLeeCode120(void) {int** triangle = (int**)malloc(4 * sizeof(int*));if (!triangle) return;triangle[0] = (int*)malloc(1 * sizeof(int));if (!triangle[0]) return;triangle[0][0] = 2;triangle[1] = (int*)malloc(2 * sizeof(int));if (!triangle[1]) return;triangle[1][0] = 3;triangle[1][1] = 4;triangle[2] = (int*)malloc(3 * sizeof(int));if (!triangle[2]) return;triangle[2][0] = 6;triangle[2][1] = 5;triangle[2][2] = 7;triangle[3] = (int*)malloc(4 * sizeof(int));if (!triangle[3]) return;triangle[3][0] = 4;triangle[3][1] = 1;triangle[3][2] = 8;triangle[3][3] = 3;int triangleColSize[] = {1, 2, 3, 4};int res = minimumTotal(triangle, 4, triangleColSize);printf("res: %d\n", res);free(triangle[0]);free(triangle[1]);free(triangle[2]);free(triangle[3]);free(triangle);
}

运行:

ok. 提交到LeeCode:

ok. 

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

相关文章:

  • 元启发式算法分类
  • Ansible-file模块
  • Vue项目使用Coze的聊天窗(一)
  • 关于将tomcat、nginx 实现 注册window服务并实现自启动
  • 【精品资料鉴赏】358页 数字政府大数据中心资源平台治理建设方案
  • 关于Spring Bean之间的循环依赖
  • pake将前端web项目打包成windows可安装文件
  • 低轨卫星应用:MCU、CANFD与DCDC芯片的集成解决方案
  • AI 编程Claude Code使用详细教程
  • vue3 下载文件方式(包括通过url下载文件并修改文件名称,和文件流下载方式)
  • 如何高效筛选海量文献,避免浪费时间?
  • heyday
  • Go语言结构体初始化全面指南与最佳实践
  • 神经网络学习笔记15——高效卷积神经网络架构GhostNet
  • Mysql的Exists条件子查询
  • 电脑系统windows10怎么合盘
  • 一文详解Stata回归分析
  • GPS 定位:连接时空的数字导航革命
  • Rust 特有关键字及用法
  • 关于C++游戏开发入门:如何从零开始实现一个完整的游戏项目!
  • OpenRank结合游戏及算法技术原理
  • 协方差矩阵、皮尔逊相关系数
  • Redis 三大架构模式详解:主从复制、哨兵、Cluster 搭建全指南
  • [x-cmd] 如何安全卸载 x-cmd
  • 整体设计 语言拼凑/逻辑拆解/词典缝合 之 3 词典缝合(“他”):显露词典编纂行列式项的 “自然”三“然”:自然本然/ 自然而然/自然实然
  • linux配置ssh,亲测简单可用
  • SNMP 模块化设计解析
  • 2025的Xmind自定义安装(实测版)
  • AI“闻香识酒”:电子鼻+机器学习开启气味数字化新纪元
  • Coze工作流拆解:成语故事类小红书图文批量创作全流程