题目:给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
思路分析:
因为是从数组左上角到达右下角,且只能向右走或向下走,所以我们可以遍历数组使得每一个位置都处于最小,即动态规划中的划分子问题,找到最优子结构求解。经过遍历后,右下角的元素即为最优解。
代码:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();//分别求得二维数组vector的行数,列数
for(int i=0;i<m;i++)//双层for循环遍历每一个元素
{
for(int j=0;j<n;j++)
{
if(i==0&&j==0) continue;
//判断边界,第一个元素无需遍历
if(i>0&&j>0) grid[i][j]+=min(grid[i-1][j],grid[i][j-1]);
//如果该元素不在第一行或第一列,则该元素加上左边元素和上面元素中较小的
else if(i==0&&j!=0) grid[i][j]+=grid[i][j-1];
//如果该元素在第一行,则没有上面的元素,只能加上左边的元素
else grid[i][j]+=grid[i-1][j];
//如果该元素在第一列,则没有左边的元素,只能加上面的元素
}n
}
return grid[m-1][n-1];
//最后返回数组右下角的元素即为最小路径和
}
};
效率: