从零学算法55

这篇具有很好参考价值的文章主要介绍了从零学算法55。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

55.给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。文章来源地址https://www.toymoban.com/news/detail-832141.html

  • 从一个点能否到达目标点根据两个方面判断,第一,该点与目标点的距离;第二,在该点能跳跃的长度,并且这两点影响力相同。
  • 运用贪心的思想,我们定义最佳跳跃点为这两点因素综合起来最佳的点,也就是跳到目标点后剩余步数最大的点,比如例子 1 中 [2,3,1,1,4] 下标 1 的点跳到 target 后剩余 0 步,下标 3 的点同样如此,他们两个对于目标点 4 来说都是最佳跳跃点,而如果数组为 [2,3,1,2,4] 那么下标为 3 的点就是唯一的最佳跳跃点了,跳到 4 后还剩一步。跳跃能力好判断就是 nums[i] 越大越好,离目标点越近表示 i 越大,所以 i+nums[i] 越大表示它越是最佳跳跃点。
  • 我们假设第一个点为最佳跳跃点,如果在之后能遇到更佳的并且我们可以从当前最佳跳跃点跳过去,我们就更新最佳跳跃点,直到遍历完整个数组,我们就找到了对最后一个点来说的最佳跳跃点,最终判断是否能从该点跳到目标点即可。
  • 由于我们一直是保存着最佳跳跃点,所以如果我们从该最佳跳跃点不能到达某个点,那其他点更不用想了,这就是为什么我们最后找到的结果是对的,就像你想知道数组中是否存在数大于某个数 num,你会直接拿出数组最大数和 num 比
  •   public boolean canJump(int[] nums) {
          int index = 0;
          for(int i=1;i<nums.length;i++){
          	// 是否当前点更佳,记得一定要加 =,不然你可能到不了下一个最佳点了
              if(nums[i]+i>=index+nums[index] 
              // 能从 index 到 i
              && nums[index] >= i-index){
              	index = i;
              }
          }
          return nums[index] >= nums.length - 1 - index;
      }
    
  • 动态规划:主要还是定义难,我们定义 dp[i] 为在 i 处最多能往后跳几步,那么 dp[i] 就好推了,如果它不在 i 处停留,就还剩 dp[i-1]-1 步,如果在 i 处停留,就还剩 nums[i] 步,max 一下即可。不过得特判一下数组长度为 1 和 首位就只有 0 步的情况
  •   public boolean canJump(int[] nums) {
          if (nums.length == 1) {
              return true;
          }
          if(nums[0]==0)return false;
          int[] dp = new int[nums.length];
          dp[0] = nums[0];
          for(int i=1;i<nums.length;i++){
              dp[i]=Math.max(dp[i-1]-1,nums[i]);
              // 能直接到终点
              if(dp[i]>=nums.length-1-i)return true;
              // 后面的点都到不了了
              else if(dp[i]==0)return false;
          }
          return true;
      }
    

到了这里,关于从零学算法55的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 贪心算法和动态规划

      目录 一、简介 二、贪心算法案例:活动选择问题 1.原理介绍 三、动态规划案例:背包问题 1.原理介绍 四、贪心算法与动态规划的区别 五、总结 正则表达式-CSDN博客 深入理解HashMap:Java中的键值对存储利器-CSDN博客   贪心算法和动态规划是两种非常强大的算法设计策略,

    2024年02月05日
    浏览(38)
  • 动态规划与贪心算法的区别

    动态规划和贪心算法都是常见的算法设计技术,它们在很多问题中都有广泛的应用。它们的区别在于: 贪心算法是一种贪心的策略,每一步都采用局部最优的决策,最终得到全局最优解。因此,贪心算法通常解决的是那些具有贪心选择性质的问题,即局部最优解能导致全局最

    2024年02月12日
    浏览(38)
  • 四大算法:贪心、分治、回溯、动态规划

    贪心算法(又称贪婪算法),在求解问题时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解进行考虑,而是得到某种意义上的局部最优解。 贪心算法采用自顶向下,以迭代的方法做出贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的问题。

    2024年02月15日
    浏览(65)
  • 探索经典算法:贪心、分治、动态规划等

    贪心算法是一种常见的算法范式,通常在解决最优化问题中使用。 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法范式。其核心思想是选择每一步的最佳解决方案,以期望达到最终的全局最优解。这种算法特点在于只考虑局部最优解,而不会回溯或重新考虑

    2024年02月05日
    浏览(44)
  • 背包问题算法全解析:动态规划和贪心算法详解

    计算机背包问题是动态规划算法中的经典问题。本文将从理论和实践两个方面深入探讨计算机背包问题,并通过实际案例分析,帮助读者更好地理解和应用该问题。 背包问题是一种经典的优化问题。有的时候我们需要将有一堆不同重量或者体积的物品放入背包,但是背包容量

    2024年02月09日
    浏览(49)
  • 算法设计与分析实验:动态规划与贪心

    目录 一、零钱兑换 1.1 思路一:动态规划 1.2 思路二:贪心 二、安排工作以达到最大效益 2.1 具体思路 2.2 思路呈现 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、雇佣k名工人的最低成本 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行结果 结尾语 “生活有意思的

    2024年02月19日
    浏览(75)
  • 数据结构与算法之贪心&动态规划

            一:思考         1.某天早上公司领导找你解决一个问题,明天公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束 时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?电影的话 那肯定是最多加票价最高的,入场

    2024年02月09日
    浏览(47)
  • 算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列

    本题可以直接用双指针解法。但是本题是编辑距离的入门题目,故采用动态规划解法为后序“编辑距离”类题目打基础。 本题与最大子序列非常相似,但不同的是s必须连续,t可以不连续。 五部曲 1、dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同

    2024年02月03日
    浏览(36)
  • “算法详解”系列第3卷贪心算法和动态规划出版

    “算法详解”系列图书共有4卷,目前1到3卷已经出版。最新出版的是第3卷—贪心算法和动态规划。 “算法详解”系列图书共有4卷,本书是第3卷—贪心算法和动态规划。其中贪心算法主要包括调度、最小生成树、集群、哈夫曼编码等,动态规划主要包括背包、序列对齐、最短

    2024年02月13日
    浏览(37)
  • 01背包(动态规划,贪心算法,回溯法,分支限界法)

    有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? number=4,capacity=8 物品编号(i) W(体积) V(价值) 1 2 3 2 3 4 3 4 5 4 5 6 1.什么是动态规划 1.动态规划算法是通过拆分问题,定义问题状态和状态之间的关系, 使得

    2024年02月08日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包