Jump Game (Medium)

主要有两种思路:


一、

本题只需要判断能否到达最后一个数,那么可以采用贪心策略,到达某个位置i后,在直接在这个位置的基础上走nums[i]步,主要保证能一直前进,就能达到终点;

那么,什么时候才不能一直前进呢?

答案是,遇到0的时候,遇到nums[i]=0的时候,只要我们想办法跳过这个0,那么就可以确保我们可以继续前进。

所以遇到0时的处理方法是,往回搜索,设当前的位置为pos,即nums[pos]=0,一直搜索之前的数,判断nums[i]+i是否大于nums[pos],大于则可以继续上述的贪心算法,假如一直跳不过0(即搜索到i=0仍跳不过pos),则return false。

代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size()==1) return true;
        int pos=0;
        while(pos<nums.size()-1)
        {
            if(nums[pos]!=0)
            {//走最远的位置
                pos=nums[pos]+pos;
            }
            else
            {//如果最远的位置为0
                int now=pos;
                for(int i=pos;i>=0;i--)
                {//找到能跳过0的位置
                    if(i+nums[i]>now) 
                    {
                        pos=i+nums[i];
                        break;
                    }
                }
                if(pos==now) 
                {//找不到跳过0,则false
                    return false;
                }
            }
        }
        return true;
    }
};

二、

记录两个变量,一个是当前能达到的最远距离,另外一个是下一次能达到的最远距离。

O(n)的时间复杂度和O(1)的空间复杂度。

在到达当前最远距离前(包括当前最远距离),不断更新下一次能达到的最远距离。当到达了当前最远距离,除了更新nextMaxPos,还需要把currentMaxPos=nextMaxPos,nextMaxPos=0

下面为AC代码:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size()==1) return true;
        int currentMaxPos=nums[0];
        int nextMaxPos=0;
        for(int i=0;i<nums.size();i++)
        {
            if(i<currentMaxPos)
            {//更新下一次能达到的最远距离
                nextMaxPos=max(nextMaxPos,i+nums[i]);
                if(nextMaxPos>=nums.size()-1) return true;
            }
            else if(i==currentMaxPos)
            {//达到当前最远的位置了,更新下一次能到达的最远距离,并且更新currentMaxPos和NextMaxPos
                nextMaxPos=max(nextMaxPos,i+nums[i]);
                if(nextMaxPos>=nums.size()-1) return true;
                currentMaxPos=nextMaxPos;
                nextMaxPos=0;
                
            }
            else
            {//更新当前能到的最远位置,把下一次能达到的最远距离清零
                currentMaxPos=nextMaxPos;
                nextMaxPos=0;
            }
        }
        if(nextMaxPos>=nums.size()-1||currentMaxPos>=nums.size()-1) return true;
        else return false;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C#跳跃游戏的源代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { public float jumpForce = 10f; public float moveSpeed = 5f; public Transform groundCheck; public LayerMask groundLayer; public GameObject gameOverPanel; private Rigidbody2D rb; private Animator anim; private bool isJumping = false; private bool isGrounded = false; void Start() { rb = GetComponent<Rigidbody2D>(); anim = GetComponent<Animator>(); } void Update() { if (Input.GetKeyDown(KeyCode.Space) && isGrounded) { isJumping = true; rb.velocity = Vector2.up * jumpForce; } anim.SetBool("isJumping", isJumping); anim.SetFloat("yVelocity", rb.velocity.y); float horizontalInput = Input.GetAxisRaw("Horizontal"); rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y); if (rb.velocity.x > 0) { transform.localScale = new Vector3(1, 1, 1); } else if (rb.velocity.x < 0) { transform.localScale = new Vector3(-1, 1, 1); } isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.1f, groundLayer); if (!isGrounded) { gameOverPanel.SetActive(true); Time.timeScale = 0f; } } private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Coin")) { Destroy(collision.gameObject); } } } 在此代码中,我们定义了玩家控制器的变量和属性。我们还定义了开始和更新函数,以便在游戏中实现跳跃和移动。我们还在代码中添加了碰撞检测和游戏结束的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值