0
点赞
收藏
分享

微信扫一扫

C++刷题之旅(61)动态规划

泠之屋 2022-04-18 阅读 84
c++leetcode

LeetCode算法入门(第六十天)

动归

63.不同路径Ⅱ

在这里插入图片描述

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));
        //障碍物之后都是走不到的位置,所以初始化时,只将第一行第一列没有遇到障碍物的位置初始化为1
        for(int i = 0; i < m && obstacleGrid[i][0] == 0; i++){
            dp[i][0] = 1;
        }
        for(int j = 0; j < n && obstacleGrid[0][j] == 0; j++){
            dp[0][j] = 1;
        }
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(obstacleGrid[i][j] == 1){   //遇到障碍物,跳过
                    continue;
                }
                dp[i][j] = dp[i-1][j] + dp[i][j-1];   //从左边或者上方达到
            }
        }

        return dp[m-1][n-1];
    }
};

55.跳跃游戏

在这里插入图片描述

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int conv = 0;
        if(nums.size() == 1){
            return true;
        }
        for(int i = 0; i <= conv; i++){
            conv = max(i + nums[i], conv);   //更新可覆盖的范围
            if(conv >= nums.size() - 1){    //范围覆盖了最后一个下标
                return true;
            }
        }
        return false;
    }
};

45.跳跃游戏Ⅱ

在这里插入图片描述
最终会跳到最后的位置,所以每次就跳最远的距离。

class Solution {
public:
    int jump(vector<int>& nums) {
        int maxPos = 0, end = 0, step = 0;
        for(int i = 0; i < nums.size() -1; ++i){
            maxPos = max(maxPos, i + nums[i]);   //maxpos为每个下标能跳到的最远距离
            if(i == end){  //如果达到边界,步数+1  
                end = maxPos;  //跳跃的步数可搜索的边界
                step++;
            }

            //因为题目假设总可以到达最后一个位置,所以只用走到最大的边界即可
        }
        return step;
    }
};




举报

相关推荐

0 条评论