leetcode 55. 跳跃游戏 思考分析

题目

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

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

判断你是否能够到达最后一个位置。

示例1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

思考

这个题目,需要注意每个元素代表你在该位置可以跳跃的最大长度,而不是长度。也就是说如果是3,那么你可以走0,1,2,3步。
其次,观察题目,不能到达最后一格的原因是:某一格元素为0,且之前没有足够步数跨越这个0
来分析一下示例2:[3,2,1,0,4],连续的0个数为1
我们先遍历,找到元素0,下标为3。此刻从它前面的一个元素开始往前遍历:
下标为2的元素为1,步数为1,(步数 - (连续0的第一个下标 - 当前下标 - 1)) =(1 - (3-2 -1))=1 <= 连续的0个数,所以不行
下标为1的元素为2,步数为2,(步数 - (连续0的第一个下标 - 当前下标 - 1)) =(2 - (3-1 -1))=1 <= 连续的0个数,所以不行
下标为0的元素为3,步数为3,(步数 - (连续0的第一个下标 - 当前下标 - 1)) =(3 - (3-0 -1))=1 <= 连续的0个数,所以不行

所以我们可以归纳出一个明显的特征:(步数 - (连续0的第一个下标 - 当前下标 - 1))> 连续的0个数
只有满足这个特征才算是可以到达最后一个位置。
代码实现的时候还需要考虑特殊情况以及细节:
1、长度为1,直接为true
2、遍历从 i=1开始,i= nums.size()-1,结束
3、获取连续0的个数:

int succesive_zero = 0;
if(nums[i] == 0)
{succesive_zero = 1;for(int j = i;j < nums.size()-2;j++){if(nums[j] == 0 && nums[j+1] == 0) succesive_zero++;else break;}
}

4、如果找到了可以可以跨越连续0的步数,那么将i指针移动到跳跃的格子。并且,如果在连续0之前没有找到足够大的步数跳跃,则说明不能到达最后一个格子,但是找到了,还需要遍历之后的情况,直到整个数组都被遍历了,且没有出现不能跳过的情况,我们才能返回true。

int flag = 0;
for(int j = i-1;j >= 0;j--)
{if((nums[j]-(i-j-1)) > succesive_zero){i=i+succesive_zero;flag=1;break;}
}
if(flag == 0) return false;

AC代码

class Solution {
public:bool canJump(vector<int>& nums) {if(nums.size() == 1) return true;if(nums[0] == 0) return false;for(int i=1;i < nums.size()-1;i++){//如果当前为0,记录连续0的个数int succesive_zero = 0;if(nums[i] == 0){succesive_zero = 1;for(int j = i;j < nums.size()-2;j++){if(nums[j] == 0 && nums[j+1] == 0) succesive_zero++;else break;}//cout<< "succesive_zero"<<succesive_zero << endl;//判断i之前有没有步数,在走到i后还有剩余的步数跳过这个0,说明暂时可以,否则不行int flag = 0;for(int j = i-1;j >= 0;j--){if((nums[j]-(i-j-1)) > succesive_zero){i=i+succesive_zero;flag=1;break;}}if(flag == 0) return false;}}return true;}
};

在这里插入图片描述

参考,贪心思路,思路更加直观,代码逻辑更加简单

参考代码随想录的思路:https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA
跳几步无所谓,关键在于可跳的范围:
每次取最大的跳跃步数,这个就是跳跃的覆盖范围。
问题转化为跳跃覆盖范围究竟可不可以覆盖到终点。
每次移动取最大跳跃步数(得到最大覆盖范围),每移动一个单位,就更新最大覆盖范围。

**局部最优解:**每次取最大跳跃步数
**整体最优解:**最后得到整体最大覆盖范围,看是否能到终点。
在这里插入图片描述
编程细节:
1、i只能在cover范围内移动,每移动一个元素,cover得到该元素数值,补充覆盖范围,让i继续移动下去。
2、cover每次只取max(钙元素数值补充后的范围,cover本身范围)
3、如果cover >= 终点下标,直接return true;
AC代码:

class Solution {
public:bool canJump(vector<int>& nums) {//初始化覆盖范围int cover = 0;if(nums.size() == 1) return true;//从0开始的覆盖范围迭代for(int i = 0; i <= cover;i++){cover = max(i+nums[i],cover);if(cover >= nums.size() - 1) return true; }return false;}
};

有一说一,这个思路确实妙!也很符合贪心的逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六、项目实战---识别猫和狗

一、准备数据集 kagglecatsanddogs网上一搜一大堆&#xff0c;这里我就不上传了&#xff0c;需要的话可以私信 导包 import os import zipfile import random import shutil import tensorflow as tf from tensorflow.keras.optimizers import RMSprop from tensorflow.kera…

修改shell终端提示信息

PS1&#xff1a;就是用户平时的提示符。PS2&#xff1a;第一行没输完&#xff0c;等待第二行输入的提示符。公共设置位置:/etc/profile echo $PS1可以看到当前提示符设置例如&#xff1a;显示绿色&#xff0c;并添加时间和shell版本export PS1"\[\e[32m\][\uyou are right…

java 字谜_计算字谜的出现次数

java 字谜Problem statement: 问题陈述&#xff1a; Given a string S and a word C, return the count of the occurrences of anagrams of the word in the text. Both string and word are in lowercase letter. 给定一个字符串S和一个单词C &#xff0c;返回该单词在文本…

Origin绘制热重TG和微分热重DTG曲线

一、导入数据 二、传到Origin中 三、热重TG曲线 temp为横坐标、mass为纵坐标 绘制折线图 再稍微更改下格式 字体加粗&#xff0c;Times New Roman 曲线宽度设置为2 横纵坐标数值格式为Times New Roman 根据实际情况改下横纵坐标起始结束位置 四、微分热重DTG曲线 点击曲线…

【嵌入式系统复习】嵌入式网络与协议栈

目录开放式系统互连模型总线通信的报文组形式以及传递方式报文组形式报文传递方式网络分配与调度嵌入式TCP/IP蓝牙技术蓝牙的节能状态纠错方案蓝牙协议栈开放式系统互连模型 ISO/OSI七层模型展示了网络结构与各层的功能。 应用层&#xff1a; 提供了终端用户程序和网络之间的应…

代码兼容、技巧

代码兼容、技巧 前端开发中&#xff0c;一个头疼的事&#xff0c;就是代码的不兼容&#xff0c;这里贴出自己在前端开发中的一些解决经验。除了其浏览器本身的BUG外&#xff0c;不建议使用CSS hack来解决兼容性问题的。 IE和FF下对”li“的的高度解析不同 可以不定义高度&#…

Windows Phone 7 自定义事件

在Windows Phone的应用开发里面&#xff0c;对于事件这种东西我们可以随处可见&#xff0c;系统本来就已经封装好了各种各样的事件机制&#xff0c;如按钮的单击事件等等的。在实际的开发中&#xff0c;我们需要自己去给相关的类自定义一些事件来满足业务的要求&#xff0c;特别…

getcwd函数_PHP getcwd()函数与示例

getcwd函数PHP getcwd()函数 (PHP getcwd() function) The full form of getcwd is "Get Current Working Directory", the function getcwd() is used to get the name of the current working directory, it does not accept any parameter and returns the curren…

十四、数据库的导出和导入的两种方法

一、以SQL脚本格式导出&#xff08;推荐&#xff09; 导出 右击需要导出的数据库&#xff0c;任务—>生成脚本 下一步 选择要导出的数据库&#xff0c;下一步 内容根据需求修改&#xff0c;没啥需求直接下一步 勾选 表 勾选需要导出的数据库中的表 选择脚本保存的路…

Apache中 RewriteCond 规则参数介绍

RewriteCond就像我们程序中的if语句一样&#xff0c;表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句&#xff0c;这就是RewriteCond最原始、基础的功能&#xff0c;为了方便理解&#xff0c;下面来看看几个例子。RewriteEngine onRewriteCond %{HTT…

【C++grammar】文件I/O流的基本用法

目录1、输入输出类介绍1.C/C文件操作对比2.什么是流&#xff1f;3.C I/O流类层次4.带缓冲的输入输出5.gcc编译器cin.in_avail()2、向文件写入数据1.写文件小练习2.如何将信息同时输出到文件和屏幕&#xff1f;3、从文件读数据1.检测文件是否成功打开2.检测是否已到文件末尾3.读…

作业2 分支循环结构

书本第39页 习题2 1.输入2个整数num1和num2.计算并输出它们的和&#xff0c;差&#xff0c;积&#xff0c;商&#xff0c;余数。 //输入2个整数num1和num2.计算并输出它们的和&#xff0c;差&#xff0c;积&#xff0c;商&#xff0c;余数。//#include<stdio.h> int main…

求一个序列中最大的子序列_最大的斐波那契子序列

求一个序列中最大的子序列Problem statement: 问题陈述&#xff1a; Given an array with positive number the task to find the largest subsequence from array that contain elements which are Fibonacci numbers. 给定一个具有正数的数组&#xff0c;任务是从包含菲波纳…

十三、系统优化

系统整体框架图 程序运行进入纺织面料库存管理系统主页面 用户子系统功能演示&#xff1a; 1&#xff0c;点击用户登录进入用户登录页面&#xff0c;可以注册和找回密码 2&#xff0c;注册新用户&#xff0c;账号、密码、性别、手机号均有限制&#xff0c;用户注册需要按指定…

时间工具类[DateUtil]

View Code 1 package com.ly.util;2 3 import java.text.DateFormat;4 import java.text.ParseException;5 import java.text.SimpleDateFormat;6 import java.util.Calendar;7 import java.util.Date;8 9 /**10 * 11 * 功能描述12 * 13 * authorAdministrator14 * Date Jul 19…

JQuery delegate多次绑定的解决办法

我用delegate来控制分页&#xff0c;查询的时候会造成多次绑定 //前一页、后一页触发 1 $("body").delegate("#tableFoot a:not(a.btn)", "click", function () { 2 _options.page $(this).attr("page"); 3 loadTmpl(_option…

leetcode 45. 跳跃游戏 II 思考分析

题目 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 …

C程序实现冒泡排序

Bubble Sort is a simple, stable, and in-place sorting algorithm. 气泡排序是一种简单&#xff0c;稳定且就地的排序算法。 A stable sorting algorithm is the one where two keys having equal values appear in the same order in the sorted output array as it is pre…

一、爬虫基本概念

一、爬虫根据使用场景分类 爬虫&#xff1a; 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;让其去互联网上抓取数据的过程。 ① 通用爬虫&#xff1a;抓取系统重要的组成部分&#xff0c;抓取的是一整张页面的数据 ② 聚焦爬虫&#xff1a;建立在通用爬虫的基础之上&am…

经营你的iOS应用日志(二):异常日志

如果你去4S店修车&#xff0c;给小工说你的车哪天怎么样怎么样了&#xff0c;小工有可能会立即搬出一台电脑&#xff0c;插上行车电脑把日志打出来&#xff0c;然后告诉你你的车发生过什么故障。汽车尚且如此&#xff0c;何况移动互联网应用呢。 本文第一篇&#xff1a;经营你的…