zoukankan      html  css  js  c++  java
  • LeetCode: Triangle

    LeetCode: 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.

    地址:https://oj.leetcode.com/problems/triangle/

    算法:开两个大小为n的数组,假设我们已经完成了前面i行的搜索,其中以第i行第j个元素为终节点的最小路径的和存储在其中某个数组里,假设这个数组用指针pre指向。接下去,我们要完成第i+1行的搜索,其中以第i+1行第j个元素为终节点的路径必定是从第i行第j个节点或者第i行第j+1个节点下来的,所有在计算最小路径时只需考虑这两个路径,并把结果存储在另一个数组里,这个数组用指针p指向。由于在每一次搜索的过程中只需要上一次的结果,所以我们只用了两个数组,并且用指针pre和指针p来重复利用这两个数组,这样就可以达到O(n)的空间要求。代码:

     1 class Solution {
     2 public:
     3     int minimumTotal(vector<vector<int> > &triangle) {
     4         int n = triangle.size();
     5         if(n < 1)    return 0;
     6         if(n == 1)   return triangle[0][0];
     7         vector<int> min1(n);
     8         vector<int> min2(n);
     9         min1[0] = triangle[0][0];
    10         vector<int> *pre = &min1;
    11         vector<int> *p   = &min2;
    12         for(int i = 1; i < n; ++i){
    13             for(int j = 0; j <= i; ++j){
    14                 if(j == 0){
    15                     (*p)[j] = (*pre)[j] + triangle[i][j];
    16                 }else if(j == i){
    17                     (*p)[j] = (*pre)[j-1] + triangle[i][j];
    18                 }else{
    19                     (*p)[j] = ( (*pre)[j] > (*pre)[j-1] ? (*pre)[j-1] : (*pre)[j] ) + triangle[i][j];
    20                 }
    21             }
    22             vector<int> *t = pre;
    23             pre = p;
    24             p = t;
    25         }
    26         int result = (*pre)[0];
    27         for(int i = 1; i < n; ++i){
    28             if (result > (*pre)[i]) result = (*pre)[i];
    29         }
    30         return result;
    31     }
    32     
    33 };
  • 相关阅读:
    Git 常用命令速查表
    Android的Fragment中onActivityResult不被调用
    git基本操作
    Android混淆
    Shell
    小米手机图标应用图标不改变的问题
    linux常用基本命令
    android新建的项目界面上没有显示怎么办?
    bzoj5249: [2018多省省队联测]IIIDX(线段树)
    bzoj1951: [Sdoi2010]古代猪文(Lucas+CRT+欧拉定理)
  • 原文地址:https://www.cnblogs.com/boostable/p/leetcode_triangle.html
Copyright © 2011-2022 走看看