zoukankan      html  css  js  c++  java
  • leetcode 120 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.

    解题思路

    因为只有两个方向:下、右下;所以递推公式局部是

    dp[m + 1][n] = min(dp[m][n], dp[m][n - 1]) + triangle[m + 1][n]
    

    解题的时候要从一般到特殊,既边缘 case 放在后面考虑(边缘 case 的解决属于思维收敛)。
    完整的递推公式如下

    if n > 1
        dp[m + 1][n] = min(dp[m][n], dp[m][n - 1]) + triangle[m + 1][n] 
    else
        dp[m + 1][0] = dp[m][0] + triangle[m + 1][0]
    

    横向遍历三角形的时候,需要从右向左倒叙地遍历元素,因为 dp table 压缩存储方式成一维空间以后,会面临 dp table 的值被覆盖的问题。

    代码实现

    class Solution {
    public:
        int minimumTotal(const vector<vector<int>>& triangle) const {
        	vector<int> v(triangle.size(), INT_MAX);
        	v[0] = triangle[0][0];
        
        	for (size_t i = 1; i < triangle.size(); i++) {
        		for (int j = i; j >= 0; j--) {
        			switch (j)
        			{
        			case 0:
        				v[0] += triangle[i][0];
        				break;
        			default:
        				v[j] = min(v[j], v[j - 1]) + triangle[i][j];
        				break;
        			}
        		}
        	}
        
        	return *min_element(v.begin(), v.end());
        }
    };
    
  • 相关阅读:
    谈谈你对MVC和三层架构的理解?(月薪三万的面试题)
    logic:iterate 遍历
    db2, oracle和sqlserver取前几行的语法
    数据库常用操作语句
    css中em与px的介绍及换算方法
    禁止浏览器缓存
    JavaScript学习笔记(一)
    CSS控制表格隔行变色与鼠标滑过变色
    程序员——好好规划自己的路
    css规范
  • 原文地址:https://www.cnblogs.com/fengyubo/p/5605708.html
Copyright © 2011-2022 走看看