zoukankan      html  css  js  c++  java
  • 【leetcode】Triangle

    Question:

    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]
    ]

    Anwser 1:      

    class Solution {
    public:
        int minimumTotal(vector<vector<int> > &triangle) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            int rows = triangle.size();
            if(0 == rows) return 0;
            
            int *minSums = new int[rows];
            int *temp = new int[rows];
            
            for(int r = 0; r < rows; r++) {
                vector<int> vec = triangle[r];
                temp[0] = vec[0] + (r > 0 ? minSums[0] : 0);
                for(int i = 1; i < r; i++) {
                    temp[i] = vec[i] + min(minSums[i-1], minSums[i]);
                }
                
                if(r > 0) {
                    temp[r] = vec[r] + minSums[r-1];
                }
                    
                int *tswap = temp;
                temp = minSums;
                minSums = tswap;
            }
            
            int m = minSums[0];
            for(int i = 1; i < rows; i++) 
            {
                if(minSums[i] < m){
                    m = minSums[i];
                } 
            }
            
            delete temp;
            delete minSums;
            return m;
        }
    };


    Anwser 2:     

    class Solution {
    public:
        int minimumTotal(vector<vector<int> > &triangle) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            int line = triangle.size();
    
            for(int i = line -2 ; i >= 0; i--) 
            {
                for(int j = 0; j < triangle[i].size(); j++)
                {
                    triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]);
                }
            }
    
            return triangle[0][0];
        }
    };


    Anwser 3:

    class Solution {
    public:
        
        void run(vector<vector<int> > &triangle, int row, int idx, int curSum, int &minPath)
        {
            if (row == triangle.size())
            {
                minPath = min(minPath, curSum);
                return;
            }
            
            run(triangle, row + 1, idx, curSum + triangle[row][idx], minPath);
            run(triangle, row + 1, idx + 1, curSum + triangle[row][idx], minPath);
        }
    
        int minimumTotal(vector<vector<int> > &triangle) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            int minPath = INT_MAX;
            
            if (triangle.size() == 0) {
                return 0;
            }
            
            run(triangle, 0, 0, 0, minPath);
            
            return minPath;
        }
    };

    注意点:

    1) Judge Small is ok, but Judge Large is error

    2) 如果迭代很深的话,容易造成压栈占用内存很高,超出段后会溢出

  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3020136.html
Copyright © 2011-2022 走看看