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

  

 

posted @ 2017-08-21 03:22  hahahaf  阅读(161)  评论(0编辑  收藏  举报