leetcode oj java 64. Minimum Path Sum

来源:互联网 发布:php编程第3版pdf 编辑:程序博客网 时间:2024/06/05 04:25

一、问题描述:

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.

二、解决思路:

递归,每次向右或者向下, min(向右,向下)。

三、代码:

递归:

public class Solution {        public static int minPathSum(int[][] grid, int x, int y) {        int m = grid.length;        int n = grid[0].length;        int sum = 0;        if (x == m - 1) {            for (int i = y; i < n; i++) {                sum += grid[m - 1][i];            }            return sum;        }        if (y == n - 1) {            for (int i = x; i < m; i++) {                sum += grid[i][n - 1];            }            return sum;        }        sum = grid[x][y];        int right = minPathSum(grid, x, y + 1);        int down = minPathSum(grid, x + 1, y);        return sum + Math.min(right, down);    }    public int minPathSum(int[][] grid) {        return minPathSum(grid, 0, 0);    }}
TL了,所以考虑用数组result[m][n]来存放到每个位置的时候的路径和的最小值,这样就不需要重复计算已经遍历到的位置了。初始化第一行和第一列,遍历整个数组,每个位置的最小值是

result[i][j] = Math.min(result[i - 1][j], result[i][j - 1]) + grid[i][j];

代码:

public class Solution {    public int minPathSum(int[][] grid) {         int sum = 0;        int m = grid.length;        if (m == 0) {            return 0;        }        int n = grid[0].length;        if (n == 1) {            for (int i = 0; i < m; i++) {                sum += grid[i][0];            }            return sum;        }        if (m == 1) {            for (int i = 0; i < n; i++) {                sum += grid[0][i];            }            return sum;        }        int[][] result = new int[m][n];        result[0][0] = grid[0][0];        // 第一行:        int tmp = result[0][0];        for (int i = 1; i < n; i++) {            result[0][i] = tmp + grid[0][i];            tmp += grid[0][i];        }        // 第一列:        tmp = result[0][0];        for (int i = 1; i < m; i++) {            result[i][0] = tmp + grid[i][0];            tmp += grid[i][0];        }        for (int i = 1; i < m; i++) {            for (int j = 1; j < n; j++) {                result[i][j] = Math.min(result[i - 1][j], result[i][j - 1]) + grid[i][j];            }        }        return result[m - 1][n - 1];    }}




0 0
原创粉丝点击