当前位置: 首页 > news >正文

建网站企划书潍坊网站定制模板建站

建网站企划书,潍坊网站定制模板建站,新闻网站模板免费,长春做网站电话45. 跳跃游戏 II - 力扣(LeetCode) 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 &…

45. 跳跃游戏 II - 力扣(LeetCode)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i] 
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳3步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

 >>思路和分析

本题相对于leetCode 55.跳跃游戏 贪心算法 难度增加了,但是思路还是相似的,还是要看最大的覆盖范围

贪心思路:(O_O)?思考:计算最少步数,请问什么时候步数才一定要加一呢?

  • ① 局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一
  • ② 整体最优:一步尽可能多走,从而达到最少步数

真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!

需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖!

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点

图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)

C++代码如下:

class Solution {
public:// 贪心算法 时间复杂度: O(n) 空间复杂度: O(1)int jump(vector<int>& nums) {if (nums.size() == 1) return 0;int cur = 0;// 当前覆盖最远距离下标int next = 0;// 下一步覆盖最远距离下标int result = 0;// 记录走的最大步数for(int i=0;i<nums.size()-1;i++) {next=max(i+nums[i],next);// 更新下一步覆盖最远距离下标if(i == cur) {// 遇到当前覆盖最远距离下标if(cur != nums.size()-1) {result++; // 需要走下一步cur = next;// 更新当前覆盖最远距离下标(相当于加油了)if(cur >= nums.size()-1 ) break; // 当前覆盖最远距到达集合终点,不用做result++操作了,直接结束}else break;}}return result;}
};

来自代码随想录版本一:

// 版本一
class Solution {
public:int jump(vector<int>& nums) {if (nums.size() == 1) return 0;int curDistance = 0;    // 当前覆盖最远距离下标int ans = 0;            // 记录走的最大步数int nextDistance = 0;   // 下一步覆盖最远距离下标for (int i = 0; i < nums.size(); i++) {nextDistance = max(nums[i] + i, nextDistance);  // 更新下一步覆盖最远距离下标if (i == curDistance) {                         // 遇到当前覆盖最远距离下标ans++;                                  // 需要走下一步curDistance = nextDistance;             // 更新当前覆盖最远距离下标(相当于加油了)if (nextDistance >= nums.size() - 1) break;  // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束}}return ans;}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

 来自代码随想录版本二:

// 版本二
class Solution {
public:int jump(vector<int>& nums) {int curDistance = 0;    // 当前覆盖的最远距离下标int ans = 0;            // 记录走的最大步数int nextDistance = 0;   // 下一步覆盖的最远距离下标for (int i = 0; i < nums.size() - 1; i++) { // 注意这里是小于nums.size() - 1,这是关键所在nextDistance = max(nums[i] + i, nextDistance); // 更新下一步覆盖的最远距离下标if (i == curDistance) {                 // 遇到当前覆盖的最远距离下标curDistance = nextDistance;         // 更新当前覆盖的最远距离下标ans++;}}return ans;}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

理解本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最少步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。

参考和推荐文章、视频:

 代码随想录 (programmercarl.com)

贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏II_哔哩哔哩_bilibili 

http://www.mmbaike.com/news/101521.html

相关文章:

  • 网站建设硬件需求seo推广哪家服务好
  • 做甜品网站栏目广告推广app
  • 珠海中英文网站建设企点下载
  • 旅游类网站模板免费下载广西疫情最新消息
  • 网站建设推广方案2022年大事热点新闻
  • 做博客网站赚钱吗舆情监控系统
  • 泰安网站建设广告成人职业技能培训班
  • 青海营销网站建设公司今日最新消息新闻
  • 云服务器发布网站百度关键词优化有效果吗
  • 漳州做网站的公司宁波百度关键词推广
  • 鞍山58同城二手房出售上海排名优化seobwyseo
  • 程序员必备工具百度关键字优化精灵
  • 网站代码模板免费广州今日头条新闻
  • 做机器学习比赛的网站在线子域名二级域名查询工具
  • 网站备案后 如何建设青岛网站制作公司
  • 北京造价员变更在哪个网站做技能培训网
  • 传销教你做网站网站快照优化公司
  • 市政房城乡建设委官方网站网页制作源代码
  • 建设网站是否应当摊销html网页模板
  • 网站用视频做背景武汉大学人民医院怎么样
  • 怎么接网站开发外包推广公司产品
  • 网站做HTTPS的重要海外seo是什么
  • 做评测好的视频网站有哪些长沙好的seo外包公司
  • 简述网站开发的三层架构游戏推广代理
  • 上海个人医疗网站备案表东莞seo优化排名
  • 微信做网站的公司关键词排名优化怎么样
  • 简洁大气的网站百度seo自动优化
  • 福田网站建设龙岗网站建设天津网站建设
  • 成都网站建设网杭州网站优化效果
  • 网站建设技能考试试题品牌维护