跳躍游戲1&2

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;
        
        }
    }
};
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容