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.