集美大学-计算机打卡(n + 2)

这段代码是用于解决一个问题:判断在给定的数组 `nums` 中,是否能够通过跳跃到达数组的最后一个元素,并且返回所需的最小步数。

 //当前的覆盖最大区域
        int curDistance = 0;
        //最大的覆盖区域
        int maxDistance = 0;
        for (int i = 0; i < nums.length; i++) {
            //在可覆盖区域内更新最大的覆盖区域
            maxDistance = Math.max(maxDistance,i+nums[i]);
            //说明当前一步,再跳一步就到达了末尾
            if (maxDistance>=nums.length-1){
                count++;
                break;
            }
            //走到当前覆盖的最大区域时,更新下一步可达的最大区域
            if (i==curDistance){
                curDistance = maxDistance;
                count++;
            }
        }
        return count;
    }

### 解释:

1. **思路概述:**
   - 通过遍历数组的每一步(每一个结点),更新当前覆盖的最大区域 `maxDistance`。
   - 如果在某一步中,最大覆盖区域已经包含了数组的最后一个元素,说明再跳一步就能到达终点。
   - 为了使步数最少,每次选择覆盖范围最大的一步,并将步数加一。

2. **变量解释:**
   - `curDistance`: 当前的覆盖最大区域。
   - `maxDistance`: 最大的覆盖区域。
   - `count`: 步数计数器。

3. **代码解释:**
   - 在循环中,通过更新 `maxDistance` 来更新当前覆盖的最大区域。
   - 如果 `maxDistance` 已经包含了数组的最后一个元素,说明再跳一步就到达了终点,此时增加步数并结束循环。
   - 在遍历到当前覆盖的最大区域时,更新下一步可达的最大区域,并增加步数。

4. **返回值:**
   - 返回最小步数 `count`。

这段代码使用贪心算法的思想,每一步都选择当前能够覆盖范围最远的地方,以达到在最小步数内到达终点的目标。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值