Triangle

来源:互联网 发布:游戏破解软件下载 编辑:程序博客网 时间:2024/06/15 04:03

https://oj.leetcode.com/problems/triangle/


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, wheren is the total number of rows in the triangle.

public int minimumTotal(List<List<Integer>> triangle)

这一题和Pascal Triangle有相似的一点也有不相似的一点。

从第二层开始考虑的时候f(i,j) = Math.min(f(i - 1, j), f(i - 1, j - 1)) + triangle[i][j]

事实上这一题不仅可以O(n) extra space,这题是可以 in place的,在循环递归的时候,把上述的f(i,j)直接换成triangle[i][j]即可,就从上可以在内部不停往下传递较小路径的答案。

到最后一层的时候就是所有较小路径的答案,然后把其中最小的挑出来就可以了

    public int minimumTotal(List<List<Integer>> triangle) {        int res = Integer.MAX_VALUE;        List<Integer> prev = null;        for(int j = 0; j < triangle.size(); j++){            List<Integer> cur = triangle.get(j);            for(int i = 0; i < cur.size(); i++){                int cur_val = cur.get(i);                if(prev != null){                    int plus_val = i == 0 ? prev.get(i) : (i == cur.size() - 1 ? prev.get(i - 1) : Math.min(prev.get(i), prev.get(i - 1)));                    cur_val += plus_val;                }                if(j == triangle.size() - 1)                    res = Math.min(res, cur_val);                cur.set(i, cur_val);            }            prev = cur;        }        return res;    }


0 0
原创粉丝点击