LeetCode-64-最小路径和

题目

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

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

示例:

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

思路

这道题属于第62题的变种,基本思路和其一样,都是分治的思想,感觉有点类似与数学归纳法:

每个格子都只可能从其上面或者左边到达,故到达每个格子的最短路径只能从其上面或左边产生,

所以只需比较上面和左边哪个的路径和最小,相加即可,需要注意边界的处理,第一行没有上面的格子;

第一列没有左边的格子,所以其路径直接由仅剩的格子路径相加即可,代码如下:

代码

#include <stdio.h>

int minPathSum(int** grid, int gridSize, int* gridColSize){
// 定义行和列
int m = gridSize;
int n = *gridColSize;

int i = -1, j = -1;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
// 处理边界
if (0==i && 0==j) continue;
if (0==i)
{
grid[i][j] += grid[i][j-1];
}
else if (0==j)
{
grid[i][j] += grid[i-1][j];
}

// 当前最小路径为上面和左边格子数取最小并和当前相加
else
{
int tmp = (grid[i-1][j] > grid[i][j-1]) ? grid[i][j-1] : grid[i-1][j];
grid[i][j] += tmp;
}
}
}
return grid[m-1][n-1];
}



posted @ 2020-03-27 21:53  樱花小猪  阅读(174)  评论(0编辑  收藏  举报