LeetCode.64 最小路径和

链接:原题目

题目描述:

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

说明

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

实例

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

思路(DP)

1.假设有个2 × 2的二维数组a,则a[0][0]到a[1][1]的路径有a[0][0]到a[0][1]到a[1][1]a[0][0]到a[1][0]到a[1][1] ,所以一个点的大小(路径)取决于它左边和上边的点的大小(路径);

2.现将第一列和第一行的每个元素都累加为前面所有元素和本身的和(从一维的角度看,数组【1,2,3】中,第一个元素到第二个元素的路径和为3,一个元素到第三个元素的路径和为6,此时数组变为【1,3,6】),此时的二维数组变为:

[
  [1     ,1+3  ,1+3+1],
  [1+1   ,5    ,1],
  [1+4+1 ,2    ,1]
]
即,
[
  [1,4,5],
  [2,5,1],
  [6,2,1]
]

3.按照思路一的做法,获得第一个元素到每个元素的最短距离(最小累加值),如:

[
  [1,4,5],
  [2,5+min(4,2),1],
  [6,2,1]
]
||
[
  [1,4,5],
  [2,7,1+min(5,7)],
  [6,2+min(6,7),1]
]
||
[
  [1,4,5],
  [2,7,6],
  [6,8,1+min(6,8)]
]
||
[
  [1,4,5],
  [2,7,6],
  [6,8,7]
]

此时的grid[0][0]到grid[2][2]最短的路径的长度为1+3+1+1+1=7(grid[0][0]——>grid[0][1]——>grid[0][2]——>grid[1][2]——>grid[2][2]

代码

int minPathSum(int** grid, int gridSize, int* gridColSize){
    int m=gridSize;
    int n=gridColSize[0];
    if(m==0||n==0) 
        return 0;
    for(int i=1; i<n; i++)
        grid[0][i] += grid[0][i-1];
    for(int i=1; i<m; i++)
        grid[i][0] += grid[i-1][0];
    int x,y;
    for(x=1; x<m; x++)
        for(y=1; y<n; y++)
            grid[x][y] += grid[x-1][y]>grid[x][y-1]?grid[x][y-1]:grid[x-1][y];
    return grid[m-1][n-1];
    /*在LeetCode中,系统给出的C模板遇到二维数组,grid代指二维数组的数组名,gridSize代指数组的行数,gridColSize是一个存储每一行的列数的数组的数组名,一般情况下可以用gridColSize[0]作为这个二维数组的列数*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值