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. python爬虫专栏学习

    知乎的一个讲python的专栏,其中爬虫的几篇文章,偏入门解释,快速看了一遍. 入门 爬虫基本原理:用最简单的代码抓取最基础的网页,展现爬虫的最基本思想,让读者知道爬虫其实是一件非常简单的事情. 爬虫 ...

  2. ionic3 cordova 调取软键盘

    应用场景,因为兼容ios,安卓问题,不能直接调用激活软键盘方法.只有在点击按钮时让input框自动获取焦点,激活软键盘.然后把input框定位在键盘上方,软键盘激活可以监听到键盘高度. 先下载keyb ...

  3. Error opening zip file or JAR manifest missing的解决方法

    错误描述: MyEclipse中启动Tomcat(debug)的时候就出现Error starting Tomcat : A configuration error occured during st ...

  4. ActiveMQ_Linux安装

    首先ActiveMQ查看你需要的版本 官网:http://activemq.apache.org/ 我这里选择的是:apache-activemq-5.14.0-bin.tar.gz 然后在linux ...

  5. 从Word中拷贝字段用于MySQL建表

    1.SQL 基础表 建立 USE [Test] GO /****** Object: Table [dbo].[CreateTable] Script Date: 10/17/2016 14:07:1 ...

  6. Java - 生成keystore

    有个需求,说要在生成PDF文件时加上signature.操作PDF容易,用: <dependency> <groupId>com.itextpdf</groupId> ...

  7. smarty assign 赋值

    assign赋值 void assign (mixed var) void assign (string varname, mixed var) This is used to assign valu ...

  8. lintcode 题目记录3

    Expression Expand  Word Break II Partition Equal Subset Sum  Expression Expand  字符串展开问题,按照[]前的数字展开字符 ...

  9. Redis(什么是Redis?)

    Redis是一个开源的内存数据库,可以作为缓存也可以作为消息队列.它支持的数据结构有:字符串.哈希表.列表.集合.有序集合. Redis:Redis是Remote Dictionary Server( ...

  10. csharp: DataTable export to excel,word,csv etc

    http://code.msdn.microsoft.com/office/Export-GridView-to-07c9f836 https://exporter.codeplex.com/ htt ...