力扣45

阅读: 评论:0

力扣45

力扣45

题目描述

给你一个非负整数数组 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

代码

顺瓜摸藤

class Solution {public int jump(int[] nums) {int n = nums.length;int len = n - 1;int res = 0;while(len > 0){for(int i = 0; i < len; i++){if(i+ nums[i] >= len){len = i;res++;break;}}}return res;}
}

顺藤摸瓜

class Solution {public int jump(int[] nums) {int position = nums.length;int maxPosition = 0;int end = 0;int res = 0;for(int i = 0; i < position - 1; i++){maxPosition = Math.max(maxPosition,i+nums[i]);if(i == end){end = maxPosition;res++;}}return res;}
}

本文发布于:2024-01-31 13:18:28,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170667831128808.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:力扣
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23