力扣45:跳跃游戏

1. 错解

看到这一题知道是贪心算法,在写代码的过程中只处理了一种情况:寻找当前位置能够跳跃到的最远位置,然后进行处理。此种情况适合用类似当前位置以及寻找到的最大位置间没有比其下一步跳的更远的索引位置,比如 [10,9,8,7,6,5,4,3,2,1,1,0]的例子。此时未考虑到另一种情况:在当前结点跳跃到最远的位置的中间是否有其比当前寻找到的最远位置下一次跳跃更远的位置?

比如:[4,1,1,3,1,1,1]

            正解: 位置间的判断:0(4)--->3(3)---->6(1)   idx(value):idx 代表索引,value 代表索引对应的数字

            错解:位置间的判断:0(4)--->4(1)--->5(1)---->6(1)

 所以需要寻找方法解决此问题?解决办法:就是依次遍历数组,在遍历的过程中要时刻更新max_position,即更新在一次跳的过程中寻找比max_position跳的更远的位置,并将其跳的更远的边界设置为end,若此时数组遍历到end,即 idx=end,说明此时已经到达跳的最远的位置,此时更新end以及steps步骤。

2. 正解

贪心:

        1. 首先寻找 当前位置i 能够跳跃到的最大位置max_position,并将其定做此能够跳的最远的右边界

        2. 为了获取能够在maxposition之内寻找到一个比max_position跳跃到更远的节点,我们需要随时更新maxposition,

        3. 若此时遍历数组到大end边界,我们此时更新end以及步数。

        注意:只需遍历到n-2即可,因为在n-2的时候已经进行了一次++,就可到达n+1处

3. 实现过程

 

4. Code

class Solution {
public:
    int jump(vector<int>& nums) {
        /*
        贪心:
        1. 首先寻找 当前位置i 能够跳跃到的最大位置max_position,并将其定做此能够跳的最远的右边界
        2. 为了获取能够在maxposition之内寻找到一个比max_position跳跃到更远的节点,我们需要随时更新maxposition,
        3. 若此时遍历数组到大end边界,我们此时更新end以及步数。
        注意:只需遍历到n-2即可,因为在n-2的时候已经进行了一次++,就可到达n+1处
        */
        // 正解:
        int n=nums.size();
        int steps=0,end=0,max_position=0;
        for(int i=0;i<n-1;i++){
            max_position=max(max_position,i+nums[i]);
            if(i==end){
                end=max_position;
                steps++;
            }
        }
        return steps;
        /*贪心,此时需要考虑两方面内容:下面写的代码未考虑到第二种情况
1. 当前结点所能够走的最远距离,此时能否走较少的次数到达终点?[10,9,8,7,6,5,4,3,2,1,0] ,
2. 当前结点在跳的过程中有没有遇到较大的跳跃数字进行跳跃,而不是以当前结点所跳跃的数字为例,然后花费更少次数到达终点?[4,1,1,3,1,1,1]
        例子[4,1,1,3,1,1,1]
            正解: 位置间的判断:0(4)--->3(3)---->6(1)   idx(value):idx 代表索引,value 代表索引对应的数字
            错解:位置间的判断:0(4)--->4(1)--->5(1)---->6(1)
        解决措施:如何将两者结合起来进行考虑?
        */
        // 判定当前结点所能跳的位置,然后在其选择中选择较大数的那个位置,依次类推
        // int n=nums.size();
        // if(n==1) return 0;
        // // int max_step=nums[0];//记录最大跳跃数
        // int max_i=0; // 记录最大跳跃数的小标;
        // // while(max_i<n){
        // //     for(int i=1;i<=max_step;i++){

        // //     }
        // // }
        // int max_step=0;
        // int i=0;
        // int step=0;
        // int flag=0;
        // while(i<n-1){
        //     // flag=0;//用来判断每次max_i是否更新,若未更新则 i++;更新则 i=max_i;max_i;
        //     // max_step=0;
        //     // for(int num=1;num<=nums[i];num++)
        //     // {
        //     //     if(num+i>=n-1)
        //     //     {
        //     //         step++;
        //     //         return step;
        //     //     }
        //     //     if(num+i>=max_step)//贪心贪错啦,应该是贪心当前所能走的最大长度
        //     //     {
        //     //         flag=1;
        //     //         max_step=num+i;
        //     //         max_i=num+i;
        //     //     }
        //     //    // cout<<num+i<<" "<<max_step<<" "<<max_i<<endl;
        //     // }

        //     step++;
        //     i=max(max_i,nums[i]+i);
        //     //else i=i+nums[i];
        //     printf("第%d次跳到什么位置%d\n",step,i);
        // }
        // return step;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值