Triangle

Problem

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

Bottom - Up DP Solution

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        if (triangle == null || triangle.size() == 0) return 0;
        int n = triangle.size();
        int[] dp = new int[n];
        for (int i = 0; i < n; i++) dp[i] = triangle.get(n - 1).get(i);
        for (int i = n - 2; i >= 0; i--) {
            for (int j = 0; j <= i; j++) {
                dp[j] = triangle.get(i).get(j) + Math.min(dp[j], dp[j + 1]);
            }
        }
        return dp[0];
    }
}

Analysis

A typical bottom up dp solution
We init the dp with elements from last row in triangle
Since the minimal path will always start from the first element
We just need to return dp[0] at the end
To fill in the dp, we starts from last second row
We loop through each element in the current row and update dp[j] with smaller bottom element
Since only adjacent element can be chosen, we use Math.min(dp[j], dp[j + 1])
Notice that left j is the minimal path in current row, and right j is from the bottom row

results matching ""

    No results matching ""