leetcode--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 {
    /**Top-down method. Since only O(n) extra memory is allowed, we use a deque to save the intermediate result.
     * @author Averill Zheng
     * @version 2014-06-23
     * @since JDK 1.7
     */
    public int minimumTotal(List<List<Integer>> triangle) {
        int min = Integer.MAX_VALUE;
		int length = triangle.size();
		if(length == 0)
			return 0;
		else if(length == 1)
			return triangle.get(0).get(0);
		else {
			Queue<Integer> sums = new LinkedList<Integer>();
			sums.add(triangle.get(0).get(0));
			for(int i = 1; i < length; ++i){
				List<Integer> aList = triangle.get(i);
				int equalIndex = sums.poll();
				sums.add(equalIndex + aList.get(i));
				int smallerIndex = (i > 1) ? sums.peek(): Math.abs(equalIndex); 
				for(int j = i - 1; j > 0; --j){
					sums.add(Math.min(smallerIndex + aList.get(j), equalIndex + aList.get(j)));				
					equalIndex = sums.poll();
					smallerIndex = sums.peek(); 					
				}
				sums.add(equalIndex + aList.get(0));
			}
			while(sums.peek() != null){
				min = Math.min(min, sums.poll());
			}
		}
		return min;
    }
}

 

method 2: bottom-up method

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        Queue<Integer> sums = new LinkedList<Integer>();
		int length = triangle.size();
		if(length == 0)
			return 0;
		else if(length == 1)
			return triangle.get(0).get(0);
		else {
			List<Integer> lastList = triangle.get(length - 1);
			for(int i = 0; i < length; ++i)
				sums.add(lastList.get(i));
			for(int i = length - 2; i > -1; --i){
				List<Integer> currentList = triangle.get(i);				
				for(int j = 0; j < i + 1; ++j){
					int equalIndex = sums.poll();
					int largerIndex = sums.peek();
					sums.add(currentList.get(j) + Math.min(equalIndex, largerIndex));
				}
				sums.poll();
			}
		}
		return sums.peek();
    }
}

 

method 3. bottom-up , and use List<Integer> as the data structure to save the intermediate result.

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int length = triangle.size();
		List<Integer> pathSum = new ArrayList<Integer>();
		if(length == 0)
			return 0;
		
		pathSum.addAll(triangle.get(length - 1));
		for(int i = length - 2; i > -1; --i){
			List<Integer> aList = triangle.get(i);
			for(int j = 0; j < i + 1; ++j)
				pathSum.set(j, Math.min(pathSum.get(j), pathSum.get(j + 1))+ aList.get(j));
		}
		return pathSum.get(0);
    }
}

  

posted @ 2014-06-24 11:27  Averill Zheng  阅读(178)  评论(0编辑  收藏  举报