LeetCode -- Minimum Path Sum

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode -- Minimum Path Sum相关的知识,希望对你有一定的参考价值。

Question:

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.

 

Analysis:

给出一个由非负数构成的 m * n 的网格,找出里面一条从左上角到右下角的最短路径。

注意:在每次行走的过程中,你只能往下或往右走。

 

思路:
1. 因为之前写过迷宫的程序,所以首先想到用迷宫的思路即由于只能往右或者往下走,而根据贪心算法,每次我们肯定选择一个代价最小的方向走。所以一般情况下只有一种选择,但是当往右走往下走代价相同时,我们不知道接下来该往哪个方向走代价会最小,所以需要用栈记录此时的信息得到所有可能的路径后,我们返回代价最小的那一条即可。
 思路肯定是没错的,但是尼玛程序老实出错%>_<%。
 
 
 
2. 参考了一点网上的思路,用动态规划,申请一块额外的空间,这样除了第一行和第一列只有一种来源之外,其他的都可能来源于左方或上方,因此用动态规划可以很容易的解决。
 
Answer:
Dynamic Programing。
public class Solution {
    public int minPathSum(int[][] rid) {
        if(rid == null || (rid.length == 0 && rid[0].length == 0)) return 0;
        if(rid.length == 1 && rid[0].length == 1) return rid[0][0];
        int row = rid.length, col = rid[0].length;
        int[][] dp = new int[row][col];
        dp[0][0] = rid[0][0];
        for(int i=0; i<row; i++) {
            for(int j=0; j<col; j++) {
                if(i == 0 && j == 0)
                    continue;
                else if(i == 0 && j != 0)
                    dp[i][j] = dp[i][j-1] + rid[i][j];
                else if(j == 0 && i != 0)
                    dp[i][j] = dp[i-1][j] + rid[i][j];
                else {
                    dp[i][j] = Math.min(dp[i][j-1], dp[i-1][j]) + rid[i][j];
                }
            }
        }
        return dp[row-1][col-1];
    }
}

 

 

以上是关于LeetCode -- Minimum Path Sum的主要内容,如果未能解决你的问题,请参考以下文章

leetcode:Minimum Path Sum

LeetCode OJ 64. Minimum Path Sum

[LeetCode] 64. Minimum Path Sum

Leetcode64 Minimum Path Sum

Leetcode64 Minimum Path Sum

[leetcode] Minimum Path Sum