leetcode 92: 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.



1st recursive. cannot pass big test set.


public class Solution {
    private int min;
    
    public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
        // Start typing your Java solution below
        // DO NOT write main() function
        //check corner case here.
        if(triangle == null) return 0;
        if(triangle.size()==0) return 0;
        
        this.min = Integer.MAX_VALUE;
        minRec(triangle, 0, 0, 0);
        return min;
    }
    
    private void minRec(ArrayList<ArrayList<Integer>> triangle, int index, int temp, int level) {
        
        
        //if(temp>=min) return;  zzzzz wrong! if negative number exist.
        temp += triangle.get(level).get(index);
        
        if( level== triangle.size()-1) {
            min = min<temp? min : temp;
            return;
        }
        
        minRec(triangle, index, temp, level+1);
        minRec(triangle, index+1, temp, level+1); 
        
    }
}

2nd try works, use dynamic programming. from n->1. not 1->n. dynamic programming want to reduce to one points. In this case, we only use half of the matrix. Since the ith result only depends on i+1 th result. we can only use one array instead of matrix.


public class Solution {
    private int min;
    
    public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
        // Start typing your Java solution below
        // DO NOT write main() function
        //check corner case here.
        if(triangle == null) return 0;
        if(triangle.size()==0) return 0;
        int sz = triangle.size();
        
        int[] d = new int[sz];
        //int[] nd = new int[sz];
        ArrayList<Integer> temp = triangle.get(sz-1);
        for(int i=0; i<sz; i++) {
            d[i] = temp.get(i);
        }
        
        
        for(int i=sz-2; i>=0; i-- ) {
            for( int j=0; j<=i;j++) {
                d[j] = triangle.get(i).get(j) + Math.min(d[j], d[j+1]);
            }            
        }
        
        return d[0];
    }
}


posted @ 2013-03-01 07:23  西施豆腐渣  阅读(248)  评论(0编辑  收藏  举报