LeetCode Jump Game && Jump GameII

JAVA算法:求解跳跃游戏(Jump Game) JAVA求解跳跃游戏(Jump Game) 原题链接:https://leetcode.com/problems/jump-game/description/ JUMP GAME 原题链接:https://leetcode.com/problems/jump-game-ii/description/ JUMP GAMEII 这两个是一类问题 问题描述:给定一个非负整数数组,给定的初始... 阅读详情

LeetCode Jump Game && Jump GameII

又是每日LeetCode Time, 这里直接解决Jump Game和Jump GameII;

先上题目:

Jump Game

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

For example:

A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

题意: 给出一个非负整数序列, 初始位置在数组下标0处, 每个元素代表能够跳跃的最远距离; 判断一个跳跃数组能否跳到数组末端, 下标n-1处;

Jump GameII

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Your goal is to reach the last index in the minimum number of jumps.

For example:
Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

题意: 给出一个非负整数序列, 初始位置在数组下标0处, 每个元素代表能够跳跃的最远距离; 求跳跃数组跳到数组末端, 下标n-1处所需的最少步数;


分析:

显然, 题目是一个图的最短路问题, 不难发现, 每个下标即为图中顶点, 而跳跃距离则隐含着顶点v所能够到达的顶点集合; 当然这也是后来经过系统地学习数据结构和算法分析后才领悟到的; 对于JumpGame2, 由于每次跳跃计数1次, 所以相当于无权图的最短路问题, 采用队列BFS就可以在O(n)时间复杂度内解决问题, 下面详细讨论;


-- 伊始:

(a)JumpGame1

不懂队列也不知道图, 所以这样做的, 先上代码:

<span style="font-size:14px;">class Solution {
public:
    bool canJump(int A[], int n) {
        int far = 0;
        for (int i = 0; i < n - 1 && far < n - 1; ++i){
        	if (i > far){
        		return false;
        	}
        	if (A[i] + i >= far){
        		far = A[i] + i;
        	}
        }
        if (far >= n - 1){
        	return true;
        }
        else return false;
    }
};</span>
分析:

-- 代码中far表示目前所能到达的最远处的下标; 

-- 我们从0出发, 向后扫描, 同时记录当前能到达的最远处far, 如果发现当前下标i比能到达的最远处far还远, 说明无法到达末位;

-- 优点是空间复杂度为O(1);


(b) JumpGame2

<span style="font-size:14px;"><span style="font-size:14px;">class Solution {
public:
    int jump(int A[], int n) {
        int distance[n], ct = 1;//ct start 1, important!
        for (int i = 0; i < n; ++i){
            distance[i] = 0;
        }
        for (int i = 0; i < n && !distance[n-1]; ++i){
            if (i && !distance[i]){
                return -1;
            }
            while (ct <= i + A[i] && ct < n){
                distance[ct++] = distance[i] + 1;
            }
        }
        return distance[n-1];
    }
};</span></span>
分析:

-- 使用辅助数组distance记录当前的最小步数, 初始化为0;

-- ct代表所能到达的最远下标, 同上面的far;

-- 空间复杂度为O(n);


-- 进阶

(a)JumpGame1

使用队列BFS求解, 感觉更好理解, 图的可达性问题

<span style="font-size:14px;"><span style="font-size:14px;">class Solution {
public:
    bool canJump(int A[], int n) {
        if (n == 1)
            return true;
        queue<int> available;
        vector<int> visited(n, false);
        available.push(0); visited[0] = true;
        while (!available.empty()) {
            int cur = available.front(); available.pop();
            for (int i = A[cur]; i != 0; --i) {
                if (cur + i >= n - 1)
                    return true;
                if (visited[cur+i])
                    break;
                available.push(cur + i); visited[cur+i] = true;
            }
        }
        return false;
    }
};</span></span>
分析:

-- 时间复杂度O(n), 空间复杂度O(n)

-- 思路就是将所有可达点入队, 同时标记为visited, 直到队列为空

-- 此处循环从A[cur]开始, 这样可以稍微优化一些, 如判断已经可达, 就直接return true, 同时能够在visited[cur+i]为true时跳出循环


(b) JumpGame2

<span style="font-size:14px;"><span style="font-size:14px;">class Solution {
public:
    int jump(int A[], int n) {
        if (n == 1)
            return 0;
        queue<int> available, count;
        vector<int> visited(n, false);
        available.push(0); visited[0] = true;
        count.push(0);
        while (!available.empty()) {
            int cur = available.front(); available.pop();
            int cnt = count.front(); count.pop();
            for (int i = A[cur]; i != 0; --i) {
                if (cur + i >= n - 1)
                    return cnt + 1;
                if (visited[cur+i])
                    break;
                available.push(cur + i); count.push(cnt + 1);
                visited[cur+i] = true;
            }
        }
        return -1;
    }
};</span></span>
分析:

-- 此处除了使用available记录当前能够到达的点之外, 还需要用count来记录到达各个点时所需的跳跃步数;


最后:

无权图的最短路可由队列BFS求出, 当然对于不同的问题需要将其转化为已知的问题才可以, 又如已知hash表的元素, hash函数和处理冲突的方法, 求hash插入元素的顺序, 不难发现, 这实际上就是一个拓扑排序过程, 这便是问题的一个转化过程!

OpenCV实现图像搜索引擎(Image Search Engine) OpenCV(Open Source Computer Vision Library)的计算效率很高且能够完成实时任务。OpenCV库由优化的C/C++代码编写而成,能够充分发挥多核处理和硬件加速的优势。OpenCV有大量技术社区和超过900万的下载量,它的使用范围极为广泛,如人机互动、资源检查、拼接地图等。 阅读详情

相关推荐

警惕AI依赖:如何避免数字水蛭侵蚀你的认知能力

在人工智能技术日益普及的今天,人机协作已成为现代工作流的核心范式。其原理在于通过算法模型辅助人类完成信息处理、内容生成等任务,从而提升效率。然而,过度依赖AI可能导致认知卸载,引发思考能力退化等潜在风险。从技术价值看,AI的核心在于增强而非替代人类智能,关键在于建立健康的协作模式。在应用场景上,无论是编程开发、内容创作还是决策分析,用户都需警惕工具依赖对深度工作、创造性思维和决策责任的侵蚀。本文聚焦于识别AI依赖的早期信号,并提供构建分阶段使用流程、将AI作为质疑者等具体策略,旨在帮助读者守护核心认知能力,

weixin_30240349的博客 625

Jump Game 和Jump Game II---LeetCode

今天我们来看一下LeetCode的第55题和第45题:Jump Game和Jump Game II,原题连接:Jump GameII,Jump Game;个人认为这是两道典型的贪心算法题目。Jump Game的大意为:给定一组非负整数,每个整数代表着当前位置能够跳的最大的步数,判断能否从开始位置到达末尾。如: A = [2,3,1,1,4], return true. A = [3

chouchou680的博客 327

解决DevExpress汉化后不生效的5个常见问题及修复方法

本文详细解析了DevExpress汉化后不生效的5个常见问题及修复方法,包括汉化包部署位置验证、运行时缓存清除、权限与执行上下文排查、版本兼容性检测以及开发环境配置检查。通过实战案例和具体操作步骤,帮助开发者快速解决汉化失效问题,提升开发效率。

weixin_29232121的博客 261

【leetcode】(python)45. Jump GameII 跳跃游戏II

跳跃游戏IIDescriptionExample题意解题思路code 45. Jump Game II Hard Description Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array re...

。 395

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3114

CMN-700组件全解析:从XP路由器到HN-F主节点的实战配置指南

本文深入解析Arm CMN-700片上网络IP的核心组件与实战配置。重点剖析了XP网格路由器的拓扑规划与CHI通道管理,以及HN-F全一致性主节点在维护缓存一致性、管理SLC和地址映射中的关键作用。通过一个12×12网格的配置案例,为硬件工程师提供了从组件布局、地址映射到性能调优的系统级设计指南。

weixin_29313423的博客 282

【小白爬Leetcode45】3.8 跳跃游戏II Jump GameII

【小白爬Leetcode45】3.8 跳跃游戏II Jump GameII题目discription中文描述思路一 逆序法,时间复杂度O(n2),空间复杂度O(1)思路二 正序法,时间复杂度O(n),空间复杂度O(1) Leetcode 45 medium\color{#FF0000}{medium}medium 点击进入原题链接:Leetcode 45 跳跃游戏II Jump GameII 这道题的前导:Leetcode 55 跳跃游戏 Jump Game 题目 discription Given

weixin_41604040的博客 229

C#的GDI+绘图详解

/消除锯齿 或 AntiAlias。// 1.在窗体或控件的Paint事件中,用PaintEventArgs e 创建绘图对象 ---- 控件或窗体重绘时。//为控件创建绘图对象。//--------------------以上方法三选一。//2.创建绘图对象 panel1中绘图。

weixin_50920631的博客 3457

LeetCode Week7: Jump Game&Jump GameII、Patching Arrays

本周LeetCode完成的题目是三道,分别是Jump Game和Jump GameII和Patching Array。

qq_25022233的博客 289

Matlab实现雷达波位编排

1 简介 %本程序用于雷达球坐标系到正弦空间坐标系的转换,以及相控阵雷达的波位编排。 2 完整代码 ​%070228添加波位数据保存clear allclose allclc%波束宽度,单位:度BeamWidth = 3.6;theta05 = round(sin(BeamWidth*pi/180)*1000)/1000;%雷达作用空域AZ = [-15 15]; %方位角范围(雷达球坐标系),单位:度EL = [0 30]; %俯仰角范围(雷

qq_59747472的博客 2479

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

王老师青少年编程 1716

leetcode 45.Jump GameII

题目描述: Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your go

jignjingfan的博客 605

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两个操作必须作为一个整体来完成。如果在执行过程中发生错误,比如系统崩溃或者数据库出现故障,那么已经执行的部分必须全部回滚,就好像整个转账操作从未发生过一样。 一致性(Consistency):事务必须

大模型大数据攻城狮的专栏 1088

Leetcode题集——jump-game

jump-game: Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position.

In-My-World的专栏 338

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[leetcode] Jump Game II

Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your goal is to r...

JC2474223242的博客 300

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

leetcode: Jump Game

public class Solution {     public boolean canJump(int[] A) {        int i,j;         int prev0=-1;         int n=A.length;         int max=0;         for(i=0;i         {         if(A[i]==0)

lxblghds的专栏 419

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Leetcode】Jump Game II (DP)

Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your goal i

Shawn's Redemption 389

LC之45Jump Game II

从今天开始做leetCode难度为Hard部分的题目,剩下难度为Medium的题目等到以后再做,先暂停一会儿~,所以博客的标题的格式和标签都改了~ 题意:给定一个数组,每一个数组的数字代表你能最多跳几步。从起点开始,问最少跳几次能到终点? 思路:贪心问题。从起点开始,起点跳能到哪一步已知。但是未必要跳到0+num[0]步。因为在(1,num[0])可能会有某一步,从那儿开始跳下一步会跳的更远。

XiaYiZhanQiHang的博客 410

LeetCode 贪心算法 jump-game-ii 跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 在jump-game的基础上改动下...

qq_31617121的博客 425

聚类算法概述(k-Means++/FCM/凝聚层次聚类/DBSCAN)

欢迎光临我的博客:HaoyuHu’s Blog 近期做完了labmu的tunet3.0,总算有时间学习一些东西了。目前想学的有聚类分析、图像识别算法和计算机网络方面的知识。在暑假实习期间,开始着手游戏编程。聚类的目的将数据划分为若干个簇,簇内相似性大,簇间相似性小,聚类效果好。用于从数据中提取信息和规律。

coderhuhy的专栏 1万+

Leetcode Repeated DNA Sequences

Leetcode Repeated DNA Sequences

coderhuhy的专栏 4012

A-star算法概述及其在游戏开发中的应用分析

回想起曾学习A*寻径算法时,难以透彻理解其原理和机制,但随着对图和搜索算法的理解愈发深入,近期重拾A-star时发现并没有那么困难。因此对A*算法和A*变种算法进行系统地学习,同时对其在游戏开发中的应用做了更深层次上的了解。 A*算法很巧妙地结合了Dijkstra算法和Best-fit算法的优点,一方面通过设定代价函数g(x)来考虑从起始点到当前点的实际代价,另一方面通过设定启发式函数h(x)来考虑从当前点到目的地的估计代价,f(x) = g(x) + h(x)。它是从当前点击中取出f值最小的节点并进行拓展

coderhuhy的专栏 2860

python实现清华大学联网助手(三)——linux下带参数的自定义命令/import机制

上两篇已经大致满足了我起初设计的需求。 最后,对代码进行了一些优化,并且修改代码使一些函数方法可以重用。最终实现了如下功能:登录校园网、登出校园网、查询当前网络状态、查询流量、帐户余额、当前用户组等基本信息、查询本账号当前在线IP信息、查询每日流量使用明细并生成直方图。 本篇主要探讨两个问题: 1 如何将.py脚本制作成linux下带参数的自定义命令; 2 import机制及使用。

coderhuhy的专栏 2763

左偏树leftistTree和斜堆skewHeap的分析和实现

今天主要分析一下左偏树和斜堆, 这两个数据结构是二叉堆的进化版, 一方面能够实现与二叉堆相同的功能, 代码结构也比较简单; 另一方面它们的合并操作的时间复杂度为O(logn), 而普通二叉堆实现合并操作的时间复杂度为O(n);

coderhuhy的专栏 2576

python实现清华大学联网助手(一)——urllib/hashlib/getopt/time/codecs的使用

python版清华大学联网助手 github:https://github.com/HaoyuHu/python urllib/hashlib/getopt/getpass/time/codecs的使用分析和实例代码。 学习完python之后,能够明白它的语法和特性,感觉这是一种与C/C++和java截然不同的语言,它更高级,更接近自然语言。所以能通过极少的代码完成其他语言需要几百行代码才能完成的任务。前些阵子曾经用python从各大网站上抓取信息用作分析数据,觉得挺过瘾。因此为了满足在linux下快速连接

coderhuhy的专栏 2384

建堆O(n)时间复杂度证明

建堆复杂度先考虑满二叉树,计算完全二叉树建堆复杂度基本相同。对满二叉树而言,第i层(根为第0层)有2^i个节点。由于建堆过程自底向上,以交换作为主要操作,因此第i层任意节点在最不利情况下,需要经过(n-i)次交换操作才能完成以该节点为堆根节点的建堆过程。

coderhuhy的专栏 2144
上一篇: AC自动机模板及对多模式匹配的理解
下一篇: 左偏树leftistTree和斜堆skewHeap的分析和实现
coderhuhy
博客等级 码龄12年 24粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值