LeetCode:64. 最小路径和

题目链接

64. 最小路径和

题目描述

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

解题思路

动态规划

该问题可分解为多个子问题,从终点向起点开始分析,分析每个点到终点的最小值。

每个点的最小路径和=该点的值+min(右边点最小路径和,下边点最小路径和)

解题代码

public int minPathSum(int[][] grid) {
		int m = grid.length;
		int n = grid[0].length;
		int[][] path = new int[m][n];

		path[m - 1][n - 1] = grid[m - 1][n - 1];
		for (int i = m - 1; i >= 0; i--) {
			for (int j = n - 1; j >= 0; j--) {

				if (i + 1 <= m - 1 && j + 1 <= n - 1) {
					path[i][j] = grid[i][j] + Math.min(path[i][j + 1], path[i + 1][j]);
				} else if (i + 1 <= m - 1) {
					path[i][j] = grid[i][j] + path[i + 1][j];
				} else if (j + 1 <= n - 1) {
					path[i][j] = grid[i][j] + path[i][j + 1];
				}

			}
		}
		return path[0][0];

	}

解题结果

61 / 61 个通过测试用例

状态:

通过

执行用时:7 ms

你可能感兴趣的:(百练OJ与leetcode)