zoukankan      html  css  js  c++  java
  • leetcode 120. Triangle

    最简单的思路: 深度遍历,得到所有的可能,找最小的结果

    • 深度遍历时,每次计算左边,与右边的值。
    class Solution {
    public:
        void triangleGet(vector<vector<int>> triangle, vector<int> &result, int sum, int x, int y)
        {
            if(y==triangle.size()-1)
            {
                result.push_back(sum);
                return;
            }
            triangleGet(triangle, result, sum+triangle[y+1][x],x,y+1);
            if(x<triangle[y+1].size()-1)
            triangleGet(triangle,result, sum+triangle[y+1][x+1],x+1, y+1);
            
        }
        
        
        int minimumTotal(vector<vector<int>>& triangle) {
            if(triangle.size()==0)
                return 0;
            vector<int> result;
            triangleGet(triangle, result, triangle[0][0], 0,0);
            sort(result.begin(),result.end());
            return result[0];
        }
    };
    

      有两个样例不能通过,时间复杂度太高。。

    考虑动态规划求解:记录每一层的结果,来计算下一层。

    从底往上进行计算:

    到达当前位置的最小值

    class Solution {
    public:
       
        int minimumTotal(vector<vector<int>>& triangle) {
            vector<vector<int>> dp(triangle.size(), vector<int>(triangle.size(),0));
            
            for(int j=triangle[triangle.size()-1].size()-1;j>=0;j--)
            {
                dp[triangle.size()-1][j]=triangle[triangle.size()-1][j];
    
            }
            
          for(int i=triangle.size()-2;i>=0;i--)
          {
              for(int j=0;j<triangle[i].size();j++)
              {
                  cout<<dp[i+1][j+1]<<"   "<<dp[i+1][j]<<endl;
                  dp[i][j]=min(dp[i+1][j+1],dp[i+1][j])+triangle[i][j];
    
              }
          }
           return dp[0][0]; 
            
            
        }
    };
    

      

  • 相关阅读:
    公用导航栏的根据url控制选中导航js
    页面切换出动晃动解决
    redis五大数据类型
    redis简介
    Linux安装redis
    各种锁的理解
    原子引用
    理解CAS
    彻底玩转单例模式
    Volatile
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7402323.html
Copyright © 2011-2022 走看看