All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0101_0200.s0120_triangle.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0101_0200.s0120_triangle;

// #Medium #Array #Dynamic_Programming #Algorithm_I_Day_12_Dynamic_Programming
// #Dynamic_Programming_I_Day_13 #Udemy_Dynamic_Programming
// #2022_06_23_Time_2_ms_(94.63%)_Space_44.2_MB_(36.02%)

import java.util.Arrays;
import java.util.List;

/**
 * 120 - Triangle\.
 *
 * Medium
 *
 * Given a `triangle` array, return _the minimum path sum from top to bottom_.
 *
 * For each step, you may move to an adjacent number of the row below. More formally, if you are on index `i` on the current row, you may move to either index `i` or index `i + 1` on the next row.
 *
 * **Example 1:**
 *
 * **Input:** triangle = \[\[2],[3,4],[6,5,7],[4,1,8,3]]
 *
 * **Output:** 11
 *
 * **Explanation:**
 *
 *     The triangle looks like:
 *         2
 *        3 4
 *       6 5 7
 *      4 1 8 3
 *      The minimum path sum from top to bottom is 2 + 3 + 5 + 1 = 11 (underlined above). 
 *
 * **Example 2:**
 *
 * **Input:** triangle = \[\[-10]]
 *
 * **Output:** -10 
 *
 * **Constraints:**
 *
 * *   `1 <= triangle.length <= 200`
 * *   `triangle[0].length == 1`
 * *   `triangle[i].length == triangle[i - 1].length + 1`
 * *   -104 <= triangle[i][j] <= 104
 *
 * **Follow up:** Could you 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(List> triangle) {
        if (triangle == null || triangle.isEmpty()) {
            return 0;
        }
        int[][] dp = new int[triangle.size()][triangle.get(triangle.size() - 1).size()];
        for (int[] temp : dp) {
            Arrays.fill(temp, -10001);
        }
        return dfs(triangle, dp, 0, 0);
    }

    private int dfs(List> triangle, int[][] dp, int row, int col) {
        if (row >= triangle.size()) {
            return 0;
        }
        if (dp[row][col] != -10001) {
            return dp[row][col];
        }
        int sum =
                triangle.get(row).get(col)
                        + Math.min(
                                dfs(triangle, dp, row + 1, col),
                                dfs(triangle, dp, row + 1, col + 1));
        dp[row][col] = sum;
        return sum;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy