(算法分析Week8)Triangle[Medium]

来源:互联网 发布:渡口网络还在吗 编辑:程序博客网 时间:2024/06/07 16:32

120.Triangle[Medium]

题目来源

Description

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.

Solution

贪心算法不可取,因为题目限制了只能在相邻点上寻路。
比如

[   [-1],   [2,3], [1,-1,-3]]

如果用贪心算法,-1+2+(-1) = 0;
而真正的答案应该是 -1+3+(-3) = -1

还是动态规划。
一种比较直观的思路就是,求出每一条路径的代价值,然后比较找到最少的。可以通过两重循环,从第2层(相当于下标为1)开始,每次用新的代价值替换旧值,不断迭代,最后一层时即可求出每一条路径的代价。这样时间复杂度比较高,但是不需要额外的空间。

或者可以从底往上,对于每个数字,和它之后的元素比较选择较小的,再加上上面一行相邻位置的元素做为新的元素,然后一层一层的向上扫描。如果不想改动原triangle,就新开辟一个一维数组作为临时存储(初始值赋三角形最后一行的数据)
公式:
dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];

Complexity analysis

O(n²)

Code

1)自上而下class Solution {public:    int minimumTotal(vector<vector<int>>& triangle) {        if (triangle.size() == 1) {            return triangle[0][0];        }        int ans = INT_MAX;        for (int i = 1; i <= triangle.size()-1; i++) {            triangle[i][0] += triangle[i-1][0];            triangle[i][triangle[i].size()-1] +=  triangle[i-1][triangle[i-1].size()-1];            for (int j = 1; j <= triangle[i].size()-2; j++) {                int a = triangle[i-1][j];                int b = triangle[i-1][j-1];                triangle[i][j] += min(a, b);            }        }        for (int i = 0; i < triangle[triangle.size()-1].size(); i++) {            if (ans > triangle[triangle.size()-1][i]) {                ans = triangle[triangle.size()-1][i];            }        }        return ans;    }};(2)自下而上class Solution {public:    int minimumTotal(vector<vector<int> > &triangle) {        vector<int> dp(triangle.back());        for (int i = triangle.size() - 2; i >= 0; i--) {            for (int j = 0; j <= i; j++) {                dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];            }        }        return dp[0];    }};

Result

这里写图片描述

原创粉丝点击