首页 > 其他分享 >55-jump Game 跳跃游戏

55-jump Game 跳跃游戏

时间:2024-05-11 23:41:45浏览次数:15  
标签:index nums 55 位置 maxLoc jump Game dp size

问题描述

You are given an integer array nums. You are initially positioned at the array's first index, and each element in the array represents your maximum jump length at that position.

Return true if you can reach the last index, or false otherwise

解释:

给定一个数字nums,你被放在第一个位置上,nums中的每一个元素代表你处于该位置最多可以跳几步。

如果能跳到最后一个位置,返回true;否则返回false

案例

Input: nums = [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.\
解释:
第一个位置跳1步道第二个位置,第二个位置跳3步到最后一个位置

基本思想-1

设nums的大小为size,构建长度为size的数组dp。

  • dp[i] 表示的是nums[0~i-1] 有多少种方法可以跳至i位置,则dp[i] 的更新依赖于 nums[0~i-1], 具体如下:
    • 假设0<=j <=i-1, 如果 nums[j] + j >= i,那么说明由j位置可以跳到i,此时 dp[i] = dp[j] ,因为可能存在多个满足上述条件的j,所以 公式修改为 dp[i] = dp[j] + dp[i]

时间复杂度\(o(n^2)\)

代码实现如下

    def canJump(self, nums: List[int]) -> bool:
        size = len(nums)
        if size <=1 : return True
        dp = [0] * size
        dp[0] = 1 # dp[i] 跳到第i个位置的方法数目
        for i in range(1,size):
            for j in range(0,i):
                if (nums[j] > 0)  and (dp[j] > 0) and ((nums[j] + j ) >= i):
                    dp[i] = dp[i] + dp[j]
           
        return dp[size-1]>0

上述代码报错,提示 Time Limit Exceeded ,测试用例明显数组太大了,时间复杂度太高了

优化

记录0~i-1最多能跳到那个位置x,

对于位置i,只需要判断i位置是否能到达 & i位置是否可以继续跳。

当i<=x ,表示i位置可以跳到。知道进行到倒数第二个位置,此时 0~size-1的最大能跳跃位置是x,如果\(x >= size-1​\), 则表示可以跳到最终位置,否则表示不能跳到

代码

C++

    bool canJump(vector<int>& nums) {
        int size = nums.size();
        if (size<=1) return true;
        if (nums[0]<=0) return false;
        int maxLoc = nums[0];
        int maxLocIndex = 0;
        for(int i=1;i<(size-1);++i) {
            if (nums[i]<=0 || i > maxLoc) continue; // 如果i位置达不到 或者 i位置没办法跳跃
            if ((nums[i]+i) >= maxLoc) {
                maxLoc = nums[i] + i;
                maxLocIndex = i;
            }
        }
        return (size-1) <= maxLoc;
    }

标签:index,nums,55,位置,maxLoc,jump,Game,dp,size
From: https://www.cnblogs.com/douniwanli/p/18187375

相关文章

  • pwn知识——劫持IO-file_jumps攻击和environ攻击
    导言哎,异或fd指针真是令人讨厌IO_file_jumps_IO_lock_t_IO_stdfile,_IO_wide_data(针对宽字节的虚函数表),_IO_FILE_plus(含有stdin,stdout)三者均被定义为IO_file_jumps原理IO_file_jumps是一个全局变量符号,存有以下符号这个结构体主要跟缓冲区有关,比如调用puts,fread,fgets,ex......
  • 雨天的尾巴(P4556 [Vani有约会] 雨天的尾巴)
    题目描述(简约版)N个点,形成一个树状结构。有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成所有发放后,每个点存放最多的是哪种物品。注释很全,请耐心看一看,写了好久哒#include<bits/stdc++.h>usingnamespacestd;#definelsont[rt].ls#define......
  • [单机]完美国际_V155_GM工具_VM虚拟机
    [端游]完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!!教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教程走也是可以搭建成功的,但是一定要有耐......
  • CF207C3 Game with Two Trees
    CF207C3GamewithTwoTrees妙到家的树上字符串问题。约定树\(1\):\(t_1\)。树\(2\):\(t_2\)。\(S_{1/2}(i,l)\)为树\(1/2\)上节点\(i\)沿父亲走经过\(l\)​条边所构成的字符串。\(E_{1/2}(u,v)\)为树\(1/2\)上,连接节点\(u,v\)​的边的字符。\(fa_{......
  • 雨天的尾巴(P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并)
    1.题意简化N个点,形成一个树状结构。有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成所有发放后,每个点存放最多的是哪种物品。2.思路首先这道题肯定要用先建树,然后我们可以在树上的每个节点建一个权值线段树,考虑到空间问题(每个点都有1个权值......
  • 题解:CF1956A Nene's Game
    这道题其实挺有意思,多测里面还套了个多测。思路就是用向量模拟删除过程,具体请看代码里的注释。#include<bits/stdc++.h>usingnamespacestd;intk,q,a[105];voidsolve(){ intn; cin>>n; vector<int>ve; for(inti=1;i<=n;i++)ve.push_back(i);//把每个人放到向量......
  • GS61008T-MR IGLT65R025D2 IGLT65R035D2 IGLD65R055D2 CoolGaN™ e-mode 功率晶体管的
    1、GS61008T-MR:100VCoolGaN™e-mode功率晶体管说明GS61008T-MR是一款100VCoolGaN™e-mode功率晶体管,具有高电流、低损耗和高开关频率等特性。该晶体管采用GaNPX®顶侧冷却封装,具有极低的结壳热阻,适用于DCDC转换器、电机驱动器、可再生能源系统和D类音频放大器等......
  • Codeforces 1146D Frog Jumping
    首先根据裴蜀定理,能走到的点\(x\)肯定满足\(\gcd(a,b)|x\)。于是令\(g=\gcd(a,b)\),可以考虑求解\(\lfloor\frac{m}{g}\rfloor,\frac{a}{g},\frac{b}{g}\),最后记得去判一下\([g\lfloor\frac{m}{g}\rfloor,m]\)这个区间,因为只有这个区间是不满(区间长度可能\(<g\)......
  • 55. 跳跃游戏
    给你一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。示例1:输入:nums=[2,3,1,1,4]输出:true解释:可以先跳1步,从下标0到达下标1,然后再从......
  • 155. 最小栈
    设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆栈中的最小元素。示例1:......