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;
}
};