• 力扣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. }

  • 相关阅读:
    小索引大力量,记一次explain的性能优化经历
    基于SSM的开心农家乐系统设计与实现
    专栏十:10X单细胞的聚类树绘图
    大疆图像算法面试流程
    云原生微服务 第六章 Spring Cloud中使用OpenFeign
    【Java面试】Java反射优缺点
    为什么手机和电视ip地址不一样
    k8s 怎么精准获取deployment关联的pods?
    tcpdump抓包的字节数量与ethtool统计数据不同的原因
    排序算法——直接插入排序
  • 原文地址:https://blog.csdn.net/weixin_44564247/article/details/126353606