【Leetcode】【Medium】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.
解题思路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的更多相关文章
- 【LeetCode题意分析&解答】40. Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 【LeetCode题意分析&解答】37. Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- 【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 ...
- ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...
- 【LeetCode每天一题】Pascal's Triangle(杨辉三角)
Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. In Pascal's t ...
- 【leetcode刷题笔记】Triangle
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- 【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, ...
- 【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 ...
- 【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 ...
- 【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 ...
随机推荐
- 微信公众号中的支付宝支付与微信支付 && 支付宝支付问题(微信bug)
一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...
- AngularJs学习笔记--Creating Services
原版地址:http://docs.angularjs.org/guide/dev_guide.services.creating_services 虽然angular提供许多有用的service,在一 ...
- Cloudera Manager集群官方默认的各个组件开启默认顺序(图文详解)
不多说,直接上干货! 如下是 Cloudera Manager集群官方默认的各个组件开启默认顺序. http://192.168.80.31:7180/cmf/clusters/1/express-a ...
- Linux下jdk安装过程
注意:rpm 与软件相关命令 相当于 window 下的软件助手 管理软件 1 查看当前 Linux 系统是否已经安装 java 1)在命令窗口输入,可以查看系统自带的OpenJDK版本信息. jav ...
- mongodb数据导入导出mongoexport/mongoimport
数据导出 mongoexport 假设库里有一张user表,里面有2条记录,我们要将它导出 > use my_mongodb switched to db my_mongodb > db. ...
- Linux 命令 -- chown
chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.用户可以是用户或者是用户D,用户组可以是组名或组id.文件名可以使由空格 ...
- Mybatis多参数
转载自:一杯甜酒 http://blog.csdn.net/u012562943/article/details/52316071 据我目前接触到的传多个参数的方案有三种.第一种方案 DAO层的函数方 ...
- log4j 简单用法
maven添加必要库: <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <gro ...
- 多线程FTP下载日志脚本
#!/bin/bash ip_list=`cat $1` thead_num=5tmp_fifofile="/tmp/$$.fifo"mkfifo "$tmp_fifof ...
- 第七章使用java实现面向对象- 多线程
一.Thread类和Runnable接口 1.在java.lang包中定义了Runnable接口和Thread类. Runnable接口中只定义了一个方法,它的格式为: public abstract ...