[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.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.

这道题和Dungeon Game 地牢游戏非常的类似,都是用动态规划Dynamic Programming来求解的问题。而且递推式也比较容易看出来,我最先想到的方法是:

从第二行开始,triangle[i][j] = min(triangle[i - 1][j - 1], triangle[i - 1][j]), 然后两边的数字直接赋值上一行的边界值,由于限制了空间复杂度,所以我干脆直接就更新triangle数组,代码如下:

class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
        int n = triangle.size();
        for (int i = 1; i < n; ++i) {
            for (int j = 0; j < triangle[i].size(); ++j) {
                if (j == 0) triangle[i][j] += triangle[i - 1][j];
                else if (j == triangle[i].size() - 1) triangle[i][j] += triangle[i - 1][j - 1];
                else {
                    triangle[i][j] += min(triangle[i - 1][j - 1], triangle[i - 1][j]);
                }
            }
        }
        int res = triangle[n - 1][0];
        for (int i = 0; i < triangle[n - 1].size(); ++i) {
            res = min(res, triangle[n - 1][i]);
        }
        return res;
    }
};

这种方法可以通过OJ,但是毕竟修改了原始数组triangle,并不是很理想的方法。在网上搜到一种更好的DP方法,这种方法复制了三角形最后一行,作为用来更新的一位数组。然后逐个遍历这个DP数组,对于每个数字,和它之后的元素比较选择较小的再加上上面一行相邻位置的元素做为新的元素,然后一层一层的向上扫描,整个过程和冒泡排序的原理差不多,最后最小的元素都冒到前面,第一个元素即为所求。代码如下:

class Solution {
public:
    int minimumTotal(vector<vector<int> > &triangle) {
        int n = triangle.size();
        vector<int> dp(triangle.back());
        for (int i = n - 2; i >= 0; --i) {
            for (int j = 0; j <= i; ++j) {
                dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];
            }
        }
        return dp[0];
    }
};

本文转自博客园Grandyang的博客,原文链接:三角形[LeetCode] Triangle ,如需转载请自行联系原博主。

相关文章
|
4月前
|
Go
golang力扣leetcode 120.三角形最小路径和
golang力扣leetcode 120.三角形最小路径和
11 0
【LeetCode-每日一题】-120. 三角形最小路径和
【LeetCode-每日一题】-120. 三角形最小路径和
|
11月前
|
人工智能 算法 BI
【LeetCode——编程能力入门第二天】运算符(三角形的最大周长(贪心算法)/找到最近的有相同 X 或 Y 坐标的点)
给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。
76 0
|
Java
力扣120. 三角形最小路径和Java
力扣120. 三角形最小路径和Java
144 0
【力扣每日一题:8-04】611. 有效三角形的个数【中等】
【力扣每日一题:8-04】611. 有效三角形的个数【中等】
LeetCode每日一题(23)——最大三角形面积
最大三角形面积 1.题目 2.示例 3.思路 4.代码 暴力穷举 凸包
LeetCode每日一题(23)——最大三角形面积
|
存储 Python
LeetCode 120. 三角形最小路径和
给定一个三角形 triangle ,找出自顶向下的最小路径和。
91 0
LeetCode每日一题——812. 最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
57 0
LeetCode每日一题——812. 最大三角形面积
|
数据库
LeetCode(数据库)- 判断三角形
LeetCode(数据库)- 判断三角形
85 0

热门文章

最新文章