• 力扣45-跳跃游戏2——贪心算法&顺藤摸瓜&顺瓜摸藤


    题目描述

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

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

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

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

    求解思路

    顺瓜摸藤

    • 由于我们要找的找到最少的跳跃数,所以应该要求满足跳跃的距离最大;
    • 如果确定最后的一个数,在他的前面找索引最小的且能够跳到这个数的那个数
    • 比如这时候的target是数组最后的1,能满足跳到1的只有4和2,所以下一步就应该把4赋值给target;
    • 接着再找能跳到4的索引最小的数字;
    • 如何保证索引索引最小?将数组从左到右遍历就可以,第一个满足条件 i+nums[ i ] > target 的就是索引最小的数;
    • 每往前找到一个数时,证明跨了一步,变量res+1;
    • 最后返回res即可;

    顺藤摸瓜

    • 就上面这个例子来讲,从2开始跳,能跳到的节点有 3 和 1;
    • 下面开始比较3 和 1 哪个能跳的更远,谁跳的远就选谁;
    • 不难发现3 能够跳到4,而1 只能跳到1 ;

    • 于是在3跳到4的过程中,还有1,1,4三个节点,就判断这三个节点哪个跳的更远,再就是哪个能跳到最后一个节点;
    • 在代码实现的过程中,需要创建两个变量maxPosition表示当前遍历的点能够跳到的最远的距离,end表示上次跳跃可达范围的边界,如果当前跳到end,则end需要更新为当前节点能够跳的最远的距离maxPosition,同时res更新+1。

    输入输出示例end

    代码

    顺瓜摸藤

    1. class Solution {
    2. public int jump(int[] nums) {
    3. int n = nums.length;
    4. int len = n - 1;
    5. int res = 0;
    6. while(len > 0){
    7. for(int i = 0; i < len; i++){
    8. if(i+ nums[i] >= len){
    9. len = i;
    10. res++;
    11. break;
    12. }
    13. }
    14. }
    15. return res;
    16. }
    17. }

    顺藤摸瓜

    1. class Solution {
    2. public int jump(int[] nums) {
    3. int position = nums.length;
    4. int maxPosition = 0;
    5. int end = 0;
    6. int res = 0;
    7. for(int i = 0; i < position - 1; i++){
    8. maxPosition = Math.max(maxPosition,i+nums[i]);
    9. if(i == end){
    10. end = maxPosition;
    11. res++;
    12. }
    13. }
    14. return res;
    15. }
    16. }

  • 相关阅读:
    【T3】畅捷通T3凭证打印修改边距后,打印效果没有任何变化。
    阿里云操作日记
    vue elementui 实现从excel从复制多行多列后粘贴到前端界面el-table
    给图片添加图片水印
    使用es实现轻量级分布式锁
    WPF C# .NET7 基础学习
    GEE:Bfast时间序列扰动检测
    谷粒商城 高级篇 (二十四) --------- 秒杀业务
    P8198 [传智杯 #4 决赛] 背单词的小智 —二分答案
    四十、手搭简易Web框架
  • 原文地址:https://blog.csdn.net/weixin_44564247/article/details/126353606