问题描述:
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.
原问题链接:https://leetcode.com/problems/minimum-path-sum/
问题分析
这个问题其实和前面分析unique path的思路基本上一致。我们要求从最左上节点到最右下节点之间的最短距离,而且每次移动只能选择向下或者向右。那么对于初始节点来说,它的最短路径就取决于它的下面那个节点和右边那个节点哪个更小。而要求出它下面的节点和右边的节点的值,则需要进一步看这两个节点的下面和右边的元素。因此,这就构成了一个递推的关系。
再加上前面的一个基础条件,当处在最下面一行和最右边一列的元素,它们的路径是唯一的,所以它们到终点的距离就是它当前的值和到终点元素的和。而对于其他节点的元素,它的最短路径则符合如下的规律:
path[i][j] = path[i][j] + Math.min(path[i + 1][j], path[i][j + 1]);
在具体的实现里,我们可以利用原有的矩阵,而不用去额外声明一个矩阵。这样可以偷点懒。
详细的实现如下:
public class Solution { public int minPathSum(int[][] grid) { int min = 0, m = grid.length, n = grid[0].length; for(int i = n - 2; i >= 0; i--) grid[m - 1][i] += grid[m - 1][i + 1]; for(int i = m - 2; i >= 0; i--) grid[i][n - 1] += grid[i + 1][n - 1]; for(int i = m - 2; i >= 0; i--) { for(int j = n - 2; j >= 0; j--) { grid[i][j] += Math.min(grid[i + 1][j], grid[i][j + 1]); } } return grid[0][0]; } }
相关推荐
java lru leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode 题解仓库,欢迎交流学习。 下面的目录中 $number 题号代表经典 LeetCode 题目,$number.$number ...LeetCode ...Sum ...Sum ...Sum ...Minimum Path Sum 73
Minimum Path Sum Unique Paths Unique Paths II Longest Palindromic Substring Interleaving String Triangle Distinct Subsequences Decode Ways Palindrome Partitioning II Maximal Rectangle ###Recursion N-...
- 图的遍历和最短路径问题如“最短路径问题”(Shortest Path in Graph)和“最小生成树”(Minimum Spanning Tree),常常涉及到深度优先搜索(DFS)和广度优先搜索(BFS)。C++的邻接矩阵或邻接表可以表示图结构...
leetcode 【演示记录】 报告 展示 2017/03/06 1.二和,167.二和二 2107/03/06 15.3 总和,16.3 总和最近,18.4 总和,11.最多水的容器 2017/03/09 62.Unique Paths, 63.Unique Paths II, 64.Minimum Path Sum 2017/...
9. **图算法**:图问题如"最短路径"(Shortest Path)和"最小生成树"(Minimum Spanning Tree),通常涉及深度优先搜索(DFS)或广度优先搜索(BFS)。 这个"LeetCode-master"压缩包很可能是包含了针对以上各种问题...
javascript js_leetcode题解之64-minimum-path-sum.js
7. **图论**:图论问题涉及节点和边的连接,如"最短路径"(Shortest Path)或"最小生成树"(Minimum Spanning Tree)。 8. **排序与查找**:快速排序、归并排序、二分查找等经典算法在LeetCode中也有体现,例如"三...
6. **二叉树**:二叉树问题包括前序、中序、后序遍历、平衡二叉树等,如"二叉搜索树的最小绝对差"(Minimum Absolute Difference in BST),要求找到二叉搜索树中相邻节点的最大差值。 7. **图**:图的问题如"最短...
371 | [Sum of Two Integers](https://leetcode.com/problems/sum-of-two-integers/) | [C++](./C++/sum-of-two-integers.cpp) [Python](./Python/sum-of-two-integers.py) | _O(1)_ | _O(1)_ | Easy | LintCode | ...
31. Binary Tree Maximum Path Sum:二叉树中的最大路径和。 32. Binary Tree Upside Down:将一个二叉树进行翻转。 【位操作】 33. Single Number:找出数组中唯一不出现一次的数字。 34. Single Number II:找出...
- **Path Sum II**:寻找所有从根节点到叶节点的路径,其路径和等于给定的目标值。 - **Flatten Binary Tree to Linked List**:将二叉树展平为单链表。 - **Validate Binary Search Tree**:验证一个二叉树是否...
- Minimum Path Sum: 在一个m×n的网格中,找到从左上角到右下角的路径,使得路径上的数字总和最小。 - Plus One: 给定一个由整数组成的非空数组,表示一个非负整数,将这个整数加一。 - Add Binary: 给定两个二进制...
- 在 JumpGame 和 MinimumPathSum 题目中,动态规划用于找出跳跃游戏或路径选择中达到最优解的策略。 4. **堆栈**: - 堆栈数据结构可以用于处理与括号匹配、表达式求值等相关的题目。 - 在 ...
8. **栈与队列**:"Valid Parentheses"(有效括号)和"Minimum Size Subarray Sum"(最小覆盖子数组)这类题目会用到栈和队列的特性来处理问题。 9. **位操作**:位操作是计算机科学的基础,题目如"Number of 1 ...
- **数组**:数组是最基本的数据结构,LeetCode中的数组问题涉及排序、查找、子数组等,如"两数之和"(Two Sum)。 - **链表**:链表操作问题,如"反转链表"(Reverse Linked List)和"合并两个有序链表"(Merge ...
二、Python3程序64_Minimum_Path_Sum 最小路径和# 利用动态规划的方法# 要到达索引为[r,l]的网格# 一是从[r,l-1]的网格向右
本题解关注的是第931题,即“下降路径最小和”(Minimum Falling Path Sum),这是一个典型的动态规划问题,对求职面试中的算法能力考察具有重要意义。 动态规划是一种解决复杂问题的有效方法,它通过将大问题分解...
31. Binary Tree Maximum Path Sum:二叉树中的最大路径和。 32. Binary Tree Upside Down:将二叉树进行上下翻转。 五、位运算 33. Single Number:只出现一次的数字,要求不使用额外空间。 34. Single Number II...