首页 > 其他 > 详细

leetcode 120. Triangle

时间:2020-06-28 23:59:25      阅读:90      评论:0      收藏:0      [点我收藏+]

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.

 

思路:动态规划经典题。

解法一:动态规划顺推解法

 1  int minimumTotal(vector<vector<int>>& T) {
 2         int r = T.size();
 3         if (r == 0)  return 0;
 4         vector<vector<int>> dp(r, vector<int>(r, 0));
 5         dp[0][0] = T[0][0];
 6         for (int i = 1; i < r; ++i) {
 7             for (int j = 0; j <= i; ++j) {
 8                 if (j == 0) dp[i][j] = dp[i - 1][j] + T[i][j];
 9                 else if (j == i) dp[i][j] = dp[i - 1][j - 1] + T[i][j];
10                 else dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + T[i][j];
11             }
12         }
13         int minimum = dp[r - 1][0];
14         for (int j = 1; j < r; ++j)
15             minimum = min(minimum, dp[r - 1][j]);
16         return minimum;
17     }

时间复杂度:$O(n^2)$,空间复杂度:$O(n^2)$


解法二:动态规划逆推解法

 1     int minimumTotal(vector<vector<int>>& T) {
 2         int len = (T.size() > 0 ? T.size() : 0);
 3         if (len == 0) return 0;
 4         vector<int> dp(len, 0);
 5         for (int j = 0; j < len; ++j) dp[j] = T[len - 1][j];
 6         for (int i = len - 2; i >= 0; --i) {
 7             for (int j = 0; j <= i; ++j) {
 8                 dp[j] = min(dp[j], dp[j + 1]) + T[i][j];
 9             }
10         }
11         return dp[0];
12     }

时间复杂度:$O(n^2)$,空间复杂度:$O(n)$

leetcode 120. Triangle

原文:https://www.cnblogs.com/qinduanyinghua/p/13205556.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!