Leetcode:Triangle 三角形塔最小路径和

Triangle:

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

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

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

解题分析:

这个三角形表示是很蛋疼的,我们首先把它写成 左对齐形式,这样就清楚多了

设 f[i, j] 表示 从塔尖到vec[i][j]之间的最小路径和,可以得出如下表达式:

f[i, j] = min{ f[i-1, j], f[i-1, j -1] }

得出这个递归子式,我们很容易的首先想到 用一个二维数组打表,记忆化搜索

但是可不可以用一个线性数组呢?

答案是可以的,因为每一行的f[i,j] 仅仅只与上一行有关系,我们可以复用一个线性数组即可

class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
        int nRow = triangle.size();
        if (nRow == 0) return 0;
        int maxLen = triangle.at(nRow - 1).size();
        vector<int> vec(maxLen, 0);
        for (int i = 0; i < nRow; ++i) {
            for (int j = triangle.at(i).size() - 1; j >= 0; --j) {
                if (j == 0) {
                    vec.at(j) = triangle.at(i).at(j) + vec.at(j);
                } else if (j == triangle.at(i).size() - 1) {
                    vec.at(j) = triangle.at(i).at(j) + vec.at(j - 1);
                } else {
                    vec.at(j) = min(triangle.at(i).at(j) + vec.at(j), triangle.at(i).at(j) + vec.at(j-1));
                }
            }
        }
        int result = *(min_element(vec.begin(), vec.end()));
        return result;
    }
};

注意:

1. 计算f[i, j] 需要用到 f[i-1, j - 1]

当j==0时,需要单独处理边界情况

当j为每行最末一个元素时,因为每行都比上一行多出一个元素,这导致此时 其正上方是没有元素的,此时也需要单独处理边界情况

2. 计算f[i, j] 需要用到 f[i-1, j - 1],如果每一行我们都是从小到大正向循环,这会导致f[i, j-1]覆盖上一行的结果,

然后计算 f[i, j] 时使用的 f[i-1, j-1]是更新过后的结果,而不是所希望的上一行的值,会出错,所以必须 从大到小逆向循环

Leetcode:Triangle 三角形塔最小路径和

时间: 2024-10-11 11:06:31

Leetcode:Triangle 三角形塔最小路径和的相关文章

算法学习——动态规划之点数值三角形的最小路径

算法描述 在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小 右图为一个4行的点数值三角形 算法思路 接收用户输入行数n 使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成 定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右,0代表左 定义一个二维数组b[n+1][n+1] 表示到底端的数值之和 以上图4行的点数值三角形为例 b[4][1]=47 b[

[LeetCode] Triangle 三角形

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to bottom is 11 (i

Leetcode:Minimum Path Sum 最小路径和

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 此题解法同Triangle 数字三角形.在此不再赘述. class

LeetCode Triangle 三角形(最短路)

题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路. [2], [3,4], [6,5,7], [4,1,8,3] 注意:这里可以2->3>5>1,也可以2->4>5->1,隔层相邻就可以走. 思路:可以从下往上走,也可以从上往下走.都是O(n)的空间,平方阶的复杂度. 从下往上可能更简洁,因为比较到最后只有一个元素,就是为答案了,速度自然也就快,每遍历一层就有1个被淘汰. 然而我一开

lintcode 容易题:Minimum Path Sum 最小路径和

题目: 最小路径和 给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径. 样例 注意 你在同一时间只能向下或者向右移动一步 解题: 这个和求三角形的最小路径的差不多,这里是个矩阵,第一列和第一行要单独处理,每一点的值等于自身的值加上上一点的值,对于中间节点:grid[i][j] + = min( grid[i-1][j] , grid[i][j-1]) ,也就是说,i j 点的值只能是其左侧的点或者上侧的点加过来,这个时间复杂度比较高O(N2) Java程序: p

LeetCode -- Triangle 路径求最小和( 动态规划问题)

人们常说"细节决定成败". 编码工作中,同样需要关注细节. 本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正). 例1 这个问题如此地显而易见,竟然没有被发现. List<int> numList = new List<int>(); numList.Add(3); numList.Add(1); numList.Add(4); numList.Add(2); numList.Add(5); numLi

#动态规划 LeetCode 120 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 思路: 接着上一题的状态转移继续说 动态规划问题,重中之重就是找到状态转移方程,而状态转移方程很重要的一点就是明确函数的意义所在,以及记录结果

LeetCode 120——三角形最小路径和

1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的较小值然后再加上当前元素,即可得出从某一位置到最下边的最小路径和.以此类推,我们就可以求出最上边元素的最小路径和.过程如下所示: 2 3 4 6 5 7 4 1 8 3 第三行到最下边的最小元素和 7 6 10 3 min(4, 1) + 6 min(1, 8) + 5 min(8, 3) + 7

【数据结构与算法】动态规划——最小路径和(普通矩阵、三角形两题)

最小路径和 LeetCode:最小路径和 题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小. 思想: 动态规划,可以用原数组作为dp数组 代码: class Solution { public int minPathSum(int[][] grid) {