【Leetcode】64. Minimum Path Sum

来源:互联网 发布:使用java编写图形界面 编辑:程序博客网 时间:2024/06/16 09:06

Description:

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.

思路:

题目要求找到一条自顶向下的路径使得所有路径上的数字之和最小。具体来说就是找到从grid[0][0]到grid[m][n]的路径,由于只能向下或向右走,这意味着当前位置为grid[i][j]时,只能选择grid[i][j+1]或者grid[i+1][j],另外同时日过当目前的位置在最右列或者最下行时只能朝一个方向走,即grid[m-1][i]只能往grid[m-1][i+1]的方向走,而grid[i][n-1]只能往grid[i+1][n-1]的方向走。

接着,如果按照先入为主的方法,从grid[0][0]开始走,实际上是很难找到最佳路径,比如说grid[0][0]可以选择grid[0][1]或grid[1][0],可以找到当前和最小,但是没办法保证下一个和是最小的。求和问题是逐步累加的,也就意味着需要知道后面的元素。那么我们可以倒着来找,即从grid[m-1][n-1]开始。然而,会发现这样倒着找也需要进行求和比较这样的操作,那么为了使寻找时更加简单我们先对格子进行一些操作。

尝试将格子分为两个区域,分别是格子边缘以及格子内部。这里的格子边缘就是只能朝一个方向走的区域,也就是格子的最下行和最右列,这部分可以直接进行反向逐步求和,便可以得到落在此处位置时到达终点的和。比如说有一个格子是

{     {2,7,4,9,3,2},    {1,5,3,2,1,5},    {4,2,0,6,7,4},    {2,3,5,1,6,9} }

进行边缘求和后得到

{     { 2, 7, 4, 9, 3,20},    { 1, 5, 3, 2, 1,18},    { 4, 2, 0, 6, 7,13},    {26,24,21,16,15, 9} }

接着,对格子内部元素进行求和。同理,内部元素比边缘元素多一种选择,比如说上图中的7,是内部元素中的最后一个元素,此时只需要选择和最小的即可,即min(7+13, 7+15)。这样就把当前位置到达终点的最小和求了出来。逐步向上遍历,到grid[0][0]时,即可得到minimum path sum。

以下是用C++的实现过程:

class Solution {public:    int minPathSum(vector<vector<int>>& grid) {        int m=grid.size();        int n=grid[m-1].size();        for(int i=m-2;i>=0;i--){              grid[i][n-1]+=grid[i+1][n-1];          }          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--){              for(int j=n-2;j>=0;j--){                  grid[i][j]+=min(grid[i][j+1], grid[i+1][j]);              }          }          return grid[0][0];      }};
0 0
原创粉丝点击