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.

解题思路1:

使用动态规划的思路求解(解法2更符合动态规划思想)。

题目要求只能使用n的额外空间,首先想到了不断迭代数组的方法。

新建包含n个元素的数组A,初始值A[0] = triangle[0][0],即triangle第一层那唯一一个元素的值。

A表示路径运行到当前位置的最小值,之后从第二层到最后一层不断迭代,不断计算到达新一层各个位置的最小值,迭代结束后,返回数组A中记录的最小路径值,即为题目所求。

需要注意的是:

1,因为后一层比前一层多一个元素,所以每层首尾元素在计算时需要特殊对待:

  A[0] = triangle[i][0] + A[0];

  A[i-1] =  triangle[i][i-1] + A[i]

 其他元素公式为:

  A[j] = triangle[i][j] + min(A[j], A[j-1])

2、迭代数组过程,由于新旧值交替运算,很容易出错的地方是,计算一个新值时覆盖了仍需使用的旧值,导致计算其他新值时出错;

 针对本题:

  除了首尾元素外,每次计算一个新值A[j],都需要用到旧的数组中保存的A[j]和A[j-1]的值;

  因此从后往前更新,可以避免出现错误计算。

代码:

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

解题思路2:

上一解中存在两个问题:

1、由于从上到下计算,每层比上一层元素多,造成必须单独计算首尾元素,代码丑陋,可读性降低;

  解决:如果从下向上迭代运算,则可以解决这个问题;

2、最终还要遍历数组path,找到最小值返回,增加了时间;

  解决:如果从下向上迭代计算,每次计算都表示从当前位置出发,路径和的最小值,那么迭代到第一层时,就为要求的结果。

新的解法:

数组A初始值设为三角最底一层值,之后由下向上迭代三角。

A[j]的意义为:保存从当前位置运动到三角最底层,所需要的最小路径和;

而每次迭代的意义为:从当前位置,向下选择,选择下一层中,到达底端最小的路径,作为当前位置到达底端的最小路径;

注,和思路一一样,需要在数组迭代中防止新旧值交叉,因为A[j] = triangle[i][j] + min(A[j], A[j+1]),因此从左向右计算新值较为合理。

代码:

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

【Leetcode】【Medium】Triangle的更多相关文章

  1. 【LeetCode题意分析&解答】40. Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  2. 【LeetCode题意分析&解答】37. Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. 【LeetCode题意分析&解答】35. Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  4. ACM金牌选手整理的【LeetCode刷题顺序】

    算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...

  5. 【LeetCode每天一题】Pascal's Triangle(杨辉三角)

    Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. In Pascal's t ...

  6. 【leetcode刷题笔记】Triangle

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

  7. 【leetcode刷题笔记】Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  8. 【LeetCode算法题库】Day7:Remove Nth Node From End of List & Valid Parentheses & Merge Two Lists

    [Q19] Given a linked list, remove the n-th node from the end of list and return its head. Example: G ...

  9. 【LeetCode算法题库】Day4:Regular Expression Matching & Container With Most Water & Integer to Roman

    [Q10] Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...

  10. 【LeetCode算法题库】Day3:Reverse Integer & String to Integer (atoi) & Palindrome Number

    [Q7]  把数倒过来 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Outpu ...

随机推荐

  1. Java_方法的基本语法格式

    [修饰符] 返回值类型 方法名称([参数列表]){ 方法体 } [ ]中的内容是可有可无的 暂时将方法的修饰符编写为 public static 返回值类型有两种情况 : 第一种:无返回值类型,也就是 ...

  2. SqlServer索引优化 查看碎片情况

    本文引自 DBCC DBREINDEX重建索引提高SQL Server性能 查看碎片情况使用  dbcc showcontig 函数来进行 代码: --改成当前库 use DB_Name --创建变量 ...

  3. JavaScript 刷题一

    最近读<JavaScirpt编程精解>,想把里面的三个大的程序实现,现在记录下来. 问题一: 从下面这封信中,emily奶奶每封信的结尾都会用同样的格式注明哪只猫出生了,哪只猫死去了.现要 ...

  4. EasyNetQ自定义异常消息处理

    20140310补充: rabbitmq有requeue属性,可以选择消息是否返回队列,另,本文的解决方式非常之山寨,只能应用于发送和接收方式. 这几天在折腾消息队列,在.Net环境下有基于Rabbi ...

  5. web项目 log4j2 指定配置文件路径

    pom.xml需要额外引入的jar: <dependency> <groupId>org.apache.logging.log4j</groupId> <ar ...

  6. 为 “超级大脑”构建支撑能力,腾讯云聚焦AI技术落地

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 5月24日,以"无界数据.无限智能"为主题的2018腾讯"云+未来"峰会AI大数据分论坛在广州拉开帷 ...

  7. Maven是什么

    一.Maven是什么 Maven是一个Apache公司的开源项目,是项目构建工具.用来管理依赖. 1.Maven的好处 使用maven可以在项目中不用导入项目依赖的jar包,省去了下载和导入jar包的 ...

  8. yum -y update 报错:GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

    用的是centos6.5的镜像,yum源太老了,修改了之后想更新一下: yum -y update 执行报错: warning: rpmts_HdrFromFdno: Header V3 RSA/SH ...

  9. Linux下模拟多线程的并发并发shell脚本

    分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用.  ...

  10. ASP.Net Core MVC 网站在Windows服务器跑不起来

    1.vs远程发布到服务器,浏览器访问,报错502 2.打开错误提示提供的网址参考 3.安装runtime,sdk,Hosting Bundle Installer,其他操作 .....发现并没有什么用 ...