跳跃游戏1&2

作者: 徐凯_xp | 来源:发表于2018-03-10 11:50 被阅读3次

    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;
            
            }
        }
    };
    

    相关文章

      网友评论

        本文标题:跳跃游戏1&2

        本文链接:https://www.haomeiwen.com/subject/mrtmfftx.html