大厂面试真题详解:跳跃游戏

简介: 大厂面试真题详解:跳跃游戏

给出一个非负整数数组,你最初定位在数组的第一个位置。   
数组中的每个元素代表你在那个位置可以跳跃的最大长度。    
判断你是否能到达数组的最后一个位置。

在线评测地址:领扣题库官网
样例 1

输入 : [2,3,1,1,4]
输出 : true

样例 2

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

算法:动态规划

解题思路

  • 我们可以把该问题拆分成子问题,从前到后确定每个位置是否可达,用动态规划的思想求解。
  • 建立dp数组,dp[i]表示能否跳到i位。
  • 状态转移关系:

    • 如果存在某点j,dp[j]为true且从j可以跳到i,那么dp[i]为true
    • 否则,dp[i]为false

复杂度分析

  • 时间复杂度:O(n^2),n为数组长度。双重遍历。
  • 空间复杂度:O(n),n为数组长度。建立的dp[]长度为n。
    可行优化
  • 提供一些优化的思路,大家有兴趣可以自行实现:

    1. 内层遍历改成从后向前,会比从前向后更节省时间。
    2. 仔细想想不难发现:如果可以跳到i点,则说明一定可以跳到i前面的任意一点。所以,如果i位为True,前面的位置一定是True。那么我们就无需开dp数组了,这样空间复杂度可以降到O(1)。
public class Solution {
    /**
     * @param A: A list of integers
     * @return: A boolean
     */
    public boolean canJump(int[] A) {
        if (A.length == 0) {
            return false;
        }
        boolean[] dp = new boolean[A.length];
        dp[0] = true;
        for (int i = 1; i < A.length; i ++) {
            for (int j = 0; j < i; j ++) {
                // 如果之前的j节点可达,并且从此节点可以到跳到i
                if (dp[j] && A[j] + j >= i) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[A.length - 1];
    }
}

更多题解参考:九章官网solution

相关文章
|
4月前
|
决策智能
集合-Nim游戏(面试hard博弈论)
集合-Nim游戏(面试hard博弈论)
|
4月前
|
Python
最新用Python做一个变态版的《超级玛丽》游戏,面试必备知识点
最新用Python做一个变态版的《超级玛丽》游戏,面试必备知识点
最新用Python做一个变态版的《超级玛丽》游戏,面试必备知识点
|
3月前
|
存储 算法 数据挖掘
力扣174题动态规划:地下城游戏(含模拟面试)
力扣174题动态规划:地下城游戏(含模拟面试)
|
4月前
|
算法 索引
【力扣经典面试题】55. 跳跃游戏
【力扣经典面试题】55. 跳跃游戏
|
4月前
|
算法 测试技术 索引
【力扣经典面试题】45. 跳跃游戏 II
【力扣经典面试题】45. 跳跃游戏 II
|
4月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_58 游戏玩法分析 V
「SQL面试题库」 No_58 游戏玩法分析 V
|
4月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_17 游戏玩法分析 II
「SQL面试题库」 No_17 游戏玩法分析 II
|
4月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_16 游戏玩法分析 I
「SQL面试题库」 No_16 游戏玩法分析 I
|
Serverless C语言 索引
华为面试C语言真题(二)
华为面试C语言真题( 二)
291 1
华为面试C语言真题(二)
|
安全 测试技术 Python
软件测试面试题及答案,这个题库有3千多道最新面试真题可以刷
相信对于很多软件测试新手来说,技术项目的面试是十分让人头疼的,生怕没回答得好,就会跟这个offer失之交臂
191 0