算法簡述:給定一個非負整數序列,數字所在位置代表“層數”,數字本身代表在對應層數所能跳躍的“最高層數”。題目所問的是能否到達目標層,但是我們可以換一個等價的說法:所能到達的最高層數是否大於或等於所給定的目標層數。
題意分析到這裏,我們可以看出,在每次進行“跳躍”的決策時,選擇的局部最優解可以達到全局最優解,因爲可跳躍至N和M層時,若N>M,因爲可以跳躍到1~N的任意層數,則M所蘊含的所有必定解均在N的解中,即此題我們可以利用貪心算法。而局部最優的做法是,選擇“可躍至的層數”加上“該層數可躍至的最高層”的最大值。舉例子:
序列 2 3 4 1 2 ……….
分別代表前5層的情況,每層的數字代表可跳躍的層數,我們從第1層開始分析
(1) 第1層的數字爲”2”,即可跳躍到第2層或者第3層
(2) 第2層數字爲3,即總共可跳躍高1+3=4層;
第3層數字爲4,即總共可跳躍高2+4=6層;
(3) 根據貪心決策,我們選擇跳躍到第2層而不是第2層
下面附上代碼
class Solution {
public:
bool canJump(vector<int>& nums) {
int pos=0;
int temp=0;
int j=0;
while(nums[pos]!=0 && pos<nums.size()){
temp=0;
j=0;
for(int i=0;i<nums[pos];i++){
if(nums[pos+i+1]+i>=temp){
temp=nums[pos+i+1]+i+1;
j=i+1;
}
if(pos+j+nums[pos+j]>=nums.size())
break;
}
pos+=j;
}
return (pos+nums[pos])>=nums.size()-1;
}
};
題目鏈接:https://leetcode.com/problems/jump-game/description/