Minimum Path Sum in O(n * m) Time Complexity using JavaScript


Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

Example:

Input:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

Note:

Your algorithm should run in O(n * m) time and use O(n * m) extra space.


Understanding the Problem

The core challenge of this problem is to find the path from the top-left corner to the bottom-right corner of a grid that results in the minimum sum of the numbers along the path. The constraints are that you can only move either down or right at any point in time.

This problem is significant in various applications such as robotics (finding the shortest path in a grid), game development, and pathfinding algorithms.

Potential pitfalls include misunderstanding the movement constraints and not considering all possible paths.

Approach

To solve this problem, we can use dynamic programming. The idea is to build a 2D array dp where dp[i][j] represents the minimum path sum to reach cell (i, j).

1. **Naive Solution**: A naive approach would be to use recursion to explore all possible paths. However, this would be highly inefficient with a time complexity of O(2^(n+m)), where n and m are the dimensions of the grid.

2. **Optimized Solution**: We can use dynamic programming to store the results of subproblems and build up the solution iteratively. This approach ensures that each cell is computed only once, resulting in a time complexity of O(n * m).

Algorithm

1. Initialize a 2D array dp with the same dimensions as the input grid.

2. Set dp[0][0] to grid[0][0] since this is the starting point.

3. Fill in the first row and first column of dp since there is only one way to reach any cell in the first row (from the left) and the first column (from above).

4. For each remaining cell (i, j), set dp[i][j] to the value of the current cell in the grid plus the minimum of the values from the cell above and the cell to the left.

5. The value at dp[m-1][n-1] will be the minimum path sum.

Code Implementation

/**
 * @param {number[][]} grid
 * @return {number}
 */
var minPathSum = function(grid) {
    // Get the dimensions of the grid
    const m = grid.length;
    const n = grid[0].length;
    
    // Initialize a 2D dp array with the same dimensions as the grid
    const dp = Array.from({ length: m }, () => Array(n).fill(0));
    
    // Set the starting point
    dp[0][0] = grid[0][0];
    
    // Fill in the first row
    for (let j = 1; j < n; j++) {
        dp[0][j] = dp[0][j - 1] + grid[0][j];
    }
    
    // Fill in the first column
    for (let i = 1; i < m; i++) {
        dp[i][0] = dp[i - 1][0] + grid[i][0];
    }
    
    // Fill in the rest of the dp array
    for (let i = 1; i < m; i++) {
        for (let j = 1; j < n; j++) {
            dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1]);
        }
    }
    
    // The value at the bottom-right corner is the minimum path sum
    return dp[m - 1][n - 1];
};

Complexity Analysis

The time complexity of this solution is O(n * m) because we iterate through each cell of the grid once. The space complexity is also O(n * m) due to the additional 2D array dp used to store the minimum path sums.

Edge Cases

1. **Single Cell Grid**: The grid has only one cell. The output should be the value of that cell.

2. **Single Row or Single Column Grid**: The grid has only one row or one column. The output should be the sum of all cells in that row or column.

3. **Empty Grid**: The grid is empty. This is an invalid input, and the function should handle it appropriately.

Testing

To test the solution comprehensively, consider the following test cases:

Thinking and Problem-Solving Tips

1. **Break Down the Problem**: Start by understanding the constraints and breaking down the problem into smaller subproblems.

2. **Use Dynamic Programming**: For problems involving optimization and overlapping subproblems, dynamic programming is often a good approach.

3. **Practice**: Solve similar problems to get a better grasp of dynamic programming techniques.

Conclusion

In this blog post, we discussed how to solve the Minimum Path Sum problem using dynamic programming. We covered the problem definition, approach, algorithm, code implementation, complexity analysis, edge cases, and testing. Understanding and solving such problems is crucial for developing strong problem-solving skills.

Additional Resources