leetcode 120. Triangle
Posted 哈哈哈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]; } };
以上是关于leetcode 120. Triangle的主要内容,如果未能解决你的问题,请参考以下文章