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

 

public class Solution {
    public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
        // Start typing your Java solution below
        // DO NOT write main() function
        ArrayList<Integer> current = triangle.get(triangle.size()-1);
        if (triangle.size() == 1){
            return current.get(0);
        }
        Map<String, Integer> cache = new HashMap<String, Integer>();
        int min = current.get(0) + calculate(triangle, triangle.size()-2, 0, cache);
        
        for (int i=1 ; i<=current.size()-2 ; i++) {
            int up = current.get(i) + calculate(triangle, triangle.size()-2, i-1, cache);
            if (up < min)
                min = up;
            up = current.get(i) + calculate(triangle, triangle.size()-2, i, cache);
            if (up < min)
                min = up;
        }
        
        int up = current.get(current.size()-1) + calculate(triangle, triangle.size()-2, current.size()-2, cache);
        if (up < min)
            min = up;
        return min;
    }
    
    private int calculate(ArrayList<ArrayList<Integer>> triangle, int listIndex, int numIndex, Map<String, Integer> cache) {
        ArrayList<Integer> current = triangle.get(listIndex);
        if (listIndex == 0){
            return current.get(0);
        }
        
        if (numIndex == 0){
            int resultTmp = calculate(triangle, listIndex-1, 0, cache);
            cache.put((listIndex-1) + "--" + 0, resultTmp);
            return current.get(0) + resultTmp;
        }
        
        if (numIndex == current.size()-1) {
            
            return current.get(current.size()-1) + cache.get((listIndex-1) + "--" + (current.size()-2));
        }
        
        int upLeft = current.get(numIndex) + cache.get((listIndex-1) + "--" + (numIndex-1));
        
        int rightResultTmp = calculate(triangle, listIndex-1, numIndex, cache);
        int upRight = current.get(numIndex) + rightResultTmp;
        cache.put((listIndex-1) + "--" + numIndex, rightResultTmp);
        
        return (upLeft<upRight) ? upLeft : upRight;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值