LeetCode 55. Jump Game
一個數組存儲了非負整型數據,數組中的第i個元素nums[i],代表了可以從數組第i 個位置最多向前跳躍nums[i]步;已知數組各元素的情況下,求是否可以從數組的第0個位置跳躍到數組的最后一個元素的位置?
例如:
nums = [2, 3, 1, 1, 4] ,可以從nums[0] = 2 跳躍至 nums[4] = 4; nums = [3, 2, 1, 0, 4] ,不可以從nums[0] = 3 跳躍至 nums[4] = 4。
貪心規律
若此時處在第i位置,該位置最遠可以跳至第j位置(index[i]),故第i位置還可跳至: 第i+1、i+2、...、j-1、j位置;
從第i位應跳至第i+1、i+2、...、j-1、j位中可以跳的更遠位置的位置,即 index[i+1]、index[i+2]、...、index[j-1]、index[j]最大的那個!
原因:
假設該位置為x,index[x]最大,故從位置x出發,可以跳至i+1、i+2、...、j-1、j所有 位置可以達到的位置;所以跳至位置x最理想。
算法思路
1.求從第i位置最遠可跳至第index[i]位置: 根據從第i位置最遠可跳nums[i]步: index[i] = nums[i] + i;
2.初始化:
1)設置變量jump代表當前所處的位置,初始化為0; 2)設置變量max_index代表從第0位置至第jump位置這個過程中,最遠可到達的位置,初始化為index[0]。
3.利用jump掃描index數組,直到jump達到index數組尾部或jump超過max_index,掃描過程中, 更新max_index。
4.若最終jump 為數組長度,則返回true,否則返回false。
#include<vector>
class Solution{
public:
bool canJump(std::vector<int> & nums){
std::vector<int> index; //最遠可以跳至的位置
for(int i = 0;i<nums.size();i++){
index.push_back(i+ nums[i]);
}
int jump = 0;
int max_index =index[0];
while(jump < index.size && jump <= max_index){
if(max_index < index[jump]){
max_index = index[jump];
}
jump ++;
}
if(max_index == index.size()){
return true;
}
return false;
}
};
跳躍游戲2
LeetCode 45. Jump Game II
一個數組存儲了非負整型數據,數組中的第i個元素nums[i],代表了可以從數組第i 個位置最多向前跳躍nums[i]步;已知數組各元素的情況下,確認可以從第0位置跳躍到數組最后一個位置,求最少需要跳躍幾次?
例如:
nums = [2, 3, 1, 1, 4] ,從第0位置跳到第1位置,從第1位置跳至最后一個位置。
貪心規律
在到達某點前若一直不跳躍,發現從該點不能跳到更遠的地方了,在這之前肯定 有次必要的跳躍!
結論:只有在無法到達更遠的位置時,我們才應該選擇跳躍,而選擇從這之間的哪個位置跳躍?應選擇一個可以到達更遠位置的位置,跳到這個位置后,再往前跳。
算法思路
1.設置current_max_index為當前可達到的最遠位置;
2.設置pre_max_max_index為在遍歷各個位置的過程中,各個位置可達到的最遠位置;
3.設置jump_min為最少跳躍的次數。
4.利用i遍歷nums數組,若i超過current_max_index,jump_min加1,current_max_index = pre_max_max_index
5.遍歷過程中,若nums[i]+i (index[i])更大,則更新pre_max_max_index = nums[i] + i。
#include<vetor>
class Solution{
public:
int jump(std::vector<int> &nums){
if(nums.size() < 2){
return 0;
}
int current_max_index = nums[0];// 當前可達到的最遠位置
int pre_max_max_index = nums[0];//遍歷各個位置過程中,可達到的最遠位置
int jump_min =1 ;
for(int i = 1; i< nums.size();i++){
if(i > current_max_index){ // 若無法再向前移動,才進行跳躍
jump_min++;
curren_max_max_index = pre_max_max_index;
}
if(pre_max_max_index < num[i] + 1){
pre_max_max_index = nums[i]+i;
}
return jump_min;
}
}
};