zoukankan      html  css  js  c++  java
  • [LeetCode 题解]: Triangle

    前言

    【LeetCode 题解】系列传送门:  http://www.cnblogs.com/double-win/category/573499.html

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

    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.

    2. 思路

    寻找三角形中,自上而下的路径中,权值和的最小值。

    从上面的例子中,不难看出其路径的遍历方式与二叉树类似,区别就在于二叉树中 相邻两个节点的子节点都是独立的,而在三角形中,

    节点 A[0] 的子节点为 B[0], B[1] ; 节点A[1]的子节点为 B[1], B[2]。 B[1]被A[0]和A[1]共享。

    既然这个题目与二叉树如此类似,那么肯定能用DFS来做了,可是使用DFS必然效率不是很快,那么这道题有没有什么技巧呢?

    可以看到题目仅仅只是需要将和给出,而并没有要求三角形中的数据不能变,那么我们可以用贪心的方法,自底向上累加,找到最小的值。

    以上例中的第3行和第4行为例:
    A: [6,5,7], B: [4,1,8,3]
    为了描述方便,不妨设第3行为A, 第4行为B。

    由于第3行的每个节点都有左右两个孩子节点, 当进行加和遍历的时候, 如果遍历到A[i] ,那么可以选择的子节点只有 B[i] 和B[i+1]。 那么在节点A[i]处的最小和就应该是 A[i] + min{B[i],B[i+1]}.

    对A中各个元素求最小和,

    A:   [6,5,7],
    {4,1}{1,8},{8,3}
    A': [6+1, 5+1, 7+3] B: [4,1,8,3]

    可得到 A'= {7,6,10}

    向上递归,可知 triangle的首元素 triangle[0][0],必定为最小和。

    3. 解法

     1 class Solution {
     2 public:
     3     int minimumTotal(vector<vector<int> > & triangle)
     4     {
     5         vector<int> vi;
     6         int len = triangle.size();
     7         if(1==len) return triangle[0][0];
     8     
     9         int i,j;
    10         for(i=len-2;i>=0;--i)
    11         {
    12             for(j=0;j<triangle[i].size();j++)
    13             {
    14                 triangle[i][j]+= (triangle[i+1][j]<triangle[i+1][j+1]?triangle[i+1][j]:triangle[i+1][j+1]);  // 贪心策略
    15             }
    16         }
    17         return triangle[0][0];
    18     }
    19 };

    作者:Double_Win

    出处:   http://www.cnblogs.com/double-win/p/3709291.html

    声明: 由于本人水平有限,文章在表述和代码方面如有不妥之处,欢迎批评指正~

  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/double-win/p/3709291.html
Copyright © 2011-2022 走看看