leetcode64.最小路径和

ぐ巨炮叔叔 提交于 2020-01-19 02:25:42

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

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

完整代码

采用回溯的思想结果运行超时,一共61个测试用例,只通过了60个.
尽管想得到的剪枝都剪了,实在想不到如何来优化了。

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if(grid.size() == 0)
            return 0;
        int res = INT_MAX;
        path(grid, res, 0, 0, 0);
        return res;        
    }
private:
    void path(vector<vector<int>>& grid, int &res, int cur, int i, int j){        
        if(i == grid.size() - 1 && j == grid[0].size() - 1){
            cur += grid[i][j];
            if(cur < res)
                res = cur;
            return;
        }
        int temp;
        temp = cur + grid[i][j];
        //向下走
        if(i + 1 < grid.size() && temp < res)
            path(grid, res, temp, i + 1, j);
        //向右走
        if(j + 1 < grid[0].size() && temp < res)
            path(grid, res, temp, i, j+1);
    }
};

动态规划
其实这道题是典型的动态规划的题目,只怪回溯用的太熟悉了

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if(grid.size() == 0)
            return 0;
        int res = INT_MAX;
        path(grid, res, 0, 0, 0);
        return res;        
    }
private:
    void path(vector<vector<int>>& grid, int &res, int cur, int i, int j){        
        if(i == grid.size() - 1 && j == grid[0].size() - 1){
            cur += grid[i][j];
            if(cur < res)
                res = cur;
            return;
        }
        int temp;
        temp = cur + grid[i][j];
        //向下走
        if(i + 1 < grid.size() && temp < res)
            path(grid, res, temp, i + 1, j);
        //向右走
        if(j + 1 < grid[0].size() && temp < res)
            path(grid, res, temp, i, j+1);
    }
};
执行结果:通过
显示详情
执行用时 :12 ms, 在所有 C++ 提交中击败了57.07%的用户
内存消耗 :11 MB, 在所有 C++ 提交中击败了45.90%的用户
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!