64. Minimum Path Sum(Java)

来源:互联网 发布:淘宝客服链接 编辑:程序博客网 时间:2024/06/05 13:00

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.

1、sum[ i ] [ j ] = Math.min ( sum [ i - 1 ] [ j ] , sum [ i ] [ j - 1 ] ) + grid [ i ] [ j ]

class Solution {    public int minPathSum(int[][] grid) {        int m = grid.length;        int n = grid[0].length;        int[][] sum = new int[m][n];        sum[0][0] = grid[0][0];        for (int i = 1; i < m; i ++) {            sum[i][0] = sum[i - 1][0] + grid[i][0];        }        for (int j = 1; j < n; j ++) {            sum[0][j] = sum[0][j - 1] + grid[0][j];        }        for (int i = 1; i < m; i ++) {            for (int j = 1; j < n; j ++) {                sum[i][j] = Math.min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j];            }        }        return sum[m - 1][n - 1];    }}

2、用两列存储

// sum[i][j] = Math.min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j]//                         cur col        pre col        cur colclass Solution {    public int minPathSum(int[][] grid) {        int m = grid.length;        int n = grid[0].length;        int[] cur = new int[m];        int[] pre = new int[m];        pre[0] = grid[0][0];        for (int i = 1; i < m; i ++) {            pre[i] = pre[i - 1] + grid[i][0];        }        for (int j = 1; j < n; j ++) {            cur[0] = pre[0] + grid[0][j];            for (int i = 1; i < m; i ++) {                cur[i] = Math.min(pre[i], cur[i - 1]) + grid[i][j];            }            pre = cur;            cur = new int[m];        }        return pre[m - 1];    }}

3、用一列存储

// sum[i][j] = Math.min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j]//                         cur[i - 1]  上一行未被替换的cur[i]       class Solution {    public int minPathSum(int[][] grid) {        int m = grid.length;        int n = grid[0].length;        int[] cur = new int[m];        cur[0] = grid[0][0];        for (int i = 1; i < m; i ++) {            cur[i] = cur[i - 1] + grid[i][0];        }        for (int j = 1; j < n; j ++) {            cur[0] += grid[0][j];            for (int i = 1; i < m; i ++) {                cur[i] = Math.min(cur[i], cur[i - 1]) + grid[i][j];            }        }        return cur[m - 1];    }}

4、不使用额外空间存储

 class Solution {    public int minPathSum(int[][] grid) {        int m = grid.length;        int n = grid[0].length;        for (int i = 1; i < m; i ++) {            grid[i][0] += grid[i - 1][0];        }        for (int j = 1; j < n; j ++) {            grid[0][j] += grid[0][j - 1];        }        for (int j = 1; j < n; j ++) {            for (int i = 1; i < m; i ++) {                grid[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];            }        }        return grid[m - 1][n - 1];    }}
原创粉丝点击