45. 贪心算法 跳跃游戏 II

45. 跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:

假设你总是可以到达数组的最后一个位置。

 

class Solution {
public:
    int jump(vector<int>& nums) {

 /*
对于这道题目的话,首先这道题目可以看出来 假设F(x) 为 能跳到的最远的距离
那么 F(x) 为分段函数,举个例子 
0,1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4
第 0个格子只需要 0步就可以跳的到;
第 1到3 个格子需要1 步就可以跳的到
第4 到7 个格子可以两个步骤就可以跳的到

 */


        int left =0; //因此在这里我们利用一个区间搜索的形式来进行搜索 left左边界,right 右边界
        int right =0;
        int temp =0;
        if(nums.size() ==1){
            return 0;
        }
        while (left <=right){//最开始的时候 leftleft==right==0
             int max_dist =0; //最开始的时候我们利用一个变量来代表当前区间内最远能到的距离
             for(int i=left;i<=right; i++){
                 max_dist = max(max_dist, nums[i] + i);
             }

             left = right +1;//在这里不断地更新左边界和右边界;
             right = max_dist;
             temp ++;//步数 +1
             if(right >= (int) nums.size()-1) {
                 break;//当最后的数据已经在我们当前区间能到达的最远范围的时候,就停止,用 break;
             }  
        }
        return temp;

    }
};

//加油,加油,Try to make yourself more excellent...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章