1.题目描述

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

2.解法分析

此题最简单的想法就是一个深度搜索,将所有可能的路径全部找出来,比较它们的和,于是有了如下的代码:

class Solution {

public:

    int minimumTotal(vector<vector<int> > &triangle) {

        // Start typing your C/C++ solution below

        // DO NOT write int main() function

        //by areslipan@163.com

        int minTotal= 0;

        

        for(int i = 0;i<triangle.size();++i)

        {

            minTotal+=triangle[i][0];

        }

        triangleHeight = triangle.size();

        int depth = 1;

        int curSum = 0;

        

        minnum(triangle,minTotal,1,0,curSum);

        

        return minTotal;

        

    }

   

    void minnum(vector<vector<int>> &triangle,int & minTotal,int depth,int loc,int &curSum)

    {

    

        curSum+=triangle[depth-1][loc];

        if(depth == triangleHeight)

        {

            minTotal = minTotal<curSum?minTotal:curSum;return;

        }

        

        minnum(triangle,minTotal,depth+1,loc,curSum);

        curSum -= triangle[depth][loc];

        minnum(triangle,minTotal,depth+1,loc+1,curSum);

        curSum -= triangle[depth][loc+1];

    }

     private:

    int triangleHeight;

    

};

 

在小数据集上运行良好,但是大数据集上就不行了,归根结底,深度遍历一方面有重复计算,一方面有递归消耗,再加上是个O(N2)的算法,必定会很慢,不过深度遍历的算法很直观,可以作为进一步分析的基础。既然知道深度搜索不行,那么该怎么办呢,我们发现,其实这个三角是有很强的最优子结构的,分析如下:

如果最短路径通过第i层(最上一层为0层,第一个元素标号为0)的第j个元素,那么必然有最短路径通过第i层的第j-1或者第j个元素,这种二选一的情形是由题意限定的,对于每一层的首尾需特殊处理,如果最短路径通过i层的首尾元素,说明最优路径在上一层的节点已经确定。于是,若已知截止于第i-1层的各个元素的最短路径和SUMi-1(SUM为长度为i的数组),那么截止于第i层的最短路径和SUMi的每个元素可以按照如下公式计算:

  • SUMi[j] = min(SUMi-1[j-1],SUMi-1[j]) +triangle[i][j]      若 j>0且j<i
  • SUMi[0] = SUMi-1[0]+triangle[0][0];
  • SUMi[i]  =SUMi-1[i-1] +triangle[i][i];

于是有了以下的代码:

class Solution {

public:

    int minimumTotal(vector<vector<int> > &triangle) {

        // Start typing your C/C++ solution below

        // DO NOT write int main() function

        //areslipan@163.com

        

        int triangleHeight = triangle.size();

        if(triangleHeight==0)return 0;

        

        //申请一个长度为n的辅助空间,作为动态规划的备忘表

        //备忘表被循环利用,第i个循环中只有前i个元素有意义,存放的是遍历到第i层的最佳路径对应的最小值

        vector<int> mmtTable;

        mmtTable.assign(triangleHeight,0);

        mmtTable[0]= triangle[0][0];

       

        int tmp = 0;

        for(int i = 1;i<triangleHeight;++i)

        {

            //特殊处理每一层的第一个元素,因为第一个元素的上一个节点一定是上一层的第一个元素

            int cur = mmtTable[0];

            mmtTable[0] = cur + triangle[i][0];

            

            //第i层的中间节点j可能上一层节点是第i-1层的j-1和j个节点

            for(int j=1;j<i;++j)

            {

                tmp = mmtTable[j];

                mmtTable[j] = min(cur,mmtTable[j])+triangle[i][j];

                cur = tmp;

            }

            

            //特殊处理每一层的最后一个元素,因为最后一个元素的上一个节点一定是上一层的最后一个元素

            mmtTable[i] = cur+triangle[i][i];

        }

        

        vector<int>::iterator iter;

        int minTotal = mmtTable[0];

        for(iter = mmtTable.begin();iter!=mmtTable.end();++iter)

        {

            if((*iter)<minTotal)minTotal = *iter;

        }

        

        return minTotal;

        

        

    }

};

leetcode—triangle的更多相关文章

  1. [LeetCode] Triangle 三角形

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

  2. leetcode — triangle

    /** * Source : https://oj.leetcode.com/problems/triangle/ * * * Given a triangle, find the minimum p ...

  3. [leetcode]Triangle @ Python

    原题地址:https://oj.leetcode.com/problems/triangle/ 题意: Given a triangle, find the minimum path sum from ...

  4. LeetCode - Triangle

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

  5. LeetCode -- Triangle 路径求最小和( 动态规划问题)

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

  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 Triangle 三角形(最短路)

    题意:给一个用序列堆成的三角形,第n层的元素个数为n,从顶往下,每个元素可以选择与自己最近的两个下层元素往下走,类似一棵二叉树,求最短路. [], [,4], [6,,7], [4,,8,3] 注意: ...

  8. LeetCode: Triangle 解题报告

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

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. mysql UNIX时间戳与日期的相互转换 查询表信息

    UNIX时间戳转换为日期用函数FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时间戳用函数UNIX_TIMESTAMP() Sel ...

  2. 使用Memcached、Spring AOP构建数据库前端缓存框架

    数据库访问可能是很多网站的瓶颈.动不动就连接池耗尽.内存溢出等.前面已经讲到如果我们的网站是一个分布式的大型站点,那么使用 memcached实现数据库的前端缓存是个很不错的选择:但如果网站本身足够小 ...

  3. U盘、移动硬盘提示格式化的处理

    移动硬盘突然打不开了,一点击就提示要求格式化,这种问题本人亲历,现已解决,千万别格式化,千万别格式化,用系统自带磁盘恢复 CHKDSK命令即可解决此问题 方法/步骤 1.在开始菜单找到“运行”窗口,也 ...

  4. ExtJS4.2学习(15)树形表格(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-27/185.html --------------- ...

  5. unity 引入 ios 第三方sdk

    原地址:http://blog.csdn.net/u012085988/article/details/17785023 unity开发中ios应用时,要想成功引入第三方sdk,首先得知道c#与obj ...

  6. CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移

    上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...

  7. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-010-Introduction为类增加新方法@DeclareParents、<aop:declare-parents>

    一. 1.Introduction的作用是给类动态的增加方法 When Spring discovers a bean annotated with @Aspect , it will automat ...

  8. 【Linux远程管理】RDP协议远程管理

    RDP(Remote Desk Protocol).远程桌面协议,常用的Windows操作系统的远程桌面管理就就是基于该协议. 而在Linux下,我们也是可以找到开源的rdp server的,这就是x ...

  9. 创建安卓app的30个经验教训

    在添加任何第三方party之前,请三思:这真的是一个成熟的项目吗? 如果一个东西用户看不到,就不要绘制它! 除非真的需要,否则别使用数据库: 达到65k方法数限制来的非常快,真的,非常快!不过 mul ...

  10. ActionBar官方教程(1)简介及各区域介绍

    Action Bar The action bar is a window feature that identifies the user location, and provides user a ...