Jump Game I
bool canJump(vector<int>& nums) {
int n = nums.size();
int farthest = 0;
for (int i = 0; i < n - 1; i++) {
// 不断计算能跳到的最远距离
farthest = max(farthest, i + nums[i]);
// 可能碰到了 0,卡住跳不动了
if (farthest <= i) return false;
}
return farthest >= n - 1;
}
Jump Game II
class JumpGameII{
public:
int jump(vector<int> &nums){
if(nums.size() <= 1){// 若数组长度<= 1 则不用跳跃,返回0
return 0;
}
int cur_max_i= nums[0];
int pre_max_i = nums[0];
int jump_min = 1;// 最少跳跃次数
for(int i = 0; i < nums.size(); i++){
if(i > cur_max_i){//❤️ 贪心思想: 若无法再向前移动了,才进行跳跃(如: 走到i+1了,而cur_max_i还只更新到i)
jump_min++;
cur_max_i = pre_max_i;// 即更新当前可到达的最远位置
}
if(pre_max_i < i + nums[i]){ // i + nums[i] 即为index[i],即最远跳至的下标
pre_max_i = i + nums[i];
}
}//❤️ 注意以上两if不可颠倒!
return jump_min;
}
};
int main()
{
vector<int> nums;
nums.push_back(2);
nums.push_back(3);
nums.push_back(1);
nums.push_back(1);
nums.push_back(4);
JumpGameII jg2;
cout << jg2.jump(nums) << endl;
return 0;
}