力扣-贪心-45 跳跃游戏

思路

利用上一题思路先判断每一个点是否可以到达终点,构建bool数组,然后从0开始更新当前可以到达的最大值,更新这个最大值,知道这个最大值大于下标范围即可,每更新一次相当于跳跃一次,需要注意的是更新条件

  1. 从当前点可以跳到的最大范围往前剋是遍历
  2. 该点满足可以跳到重点
  3. 当前的比记录跳的范围更远
  4. 记录的还没跳到终点(因为当前记录已经可以跳到重点,就不需要更新了,直接跳到终点就可以)

代码

class Solution {
public:
    bool canJump(int index, vector &nums){
        int cover = index;
        if(index == nums.size() - 1) return true;
        for(int i = index; i <= cover;i++){
            cover = max(cover, i + nums[i]);
            if(cover >= nums.size() - 1) return true;
        }
        return false;
    }

    int jump(vector& nums) {
        vector isArriveEnd(nums.size(), false);
        for(int i = 0; i < nums.size(); i++){
            isArriveEnd[i] = canJump(i, nums);
        }

        int res = 0, cur = 0;
        for (cur = 0; cur < nums.size() - 1;) {
            int cover = cur + nums[cur];
            int curMaxAndArrive = cover;
            int length = nums.size() - 1;
            for (int j = cover; j > cur && j < nums.size(); j--) {
                if (isArriveEnd[j] && j + nums[j] > curMaxAndArrive +  nums[curMaxAndArrive]
                        && curMaxAndArrive +  nums[curMaxAndArrive] < length) {
                    curMaxAndArrive = j;
                }
            }
            res++;
            cur = curMaxAndArrive;
        }
        return res;
    }
};

你可能感兴趣的:(力扣,#,贪心,leetcode,游戏,算法)