首页 > 试题广场 >

跳跃游戏(一)

[编程题]跳跃游戏(一)
  • 热度指数:6043 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度。如果能够跳到数组最后一个位置,则输出true,否则输出false。
数据范围:


输入描述:
第一行输入一个正整数 n ,表示数组 nums 的长度
第二行输入 n 个整数表示数组的每个元素


输出描述:
输出 true 或者 false
示例1

输入

7
2 1 3 3 0 0 100

输出

true

说明

首先位于nums[0]=2,然后可以跳2步,到nums[2]=3的位置,再跳到nums[3]=3的位置,再直接跳到nums[6]=100,可以跳到最后,输出true   
示例2

输入

7
2 1 3 2 0 0 100

输出

false

说明

无论怎么样,都跳不到nums[6]=100的位置   
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }

        int maxLoc = nums[0];
        // 遍历同时判断该位置是否可到达
        for (int i = 1; i < n && i <= maxLoc; i++) {
            // 每个位置计算自己能到达的最远位置
            maxLoc = Math.max(maxLoc, nums[i] + i);
        }

        // 能到达的最远位置与数组最后一个下标比较
        System.out.println(maxLoc >= n - 1);
    }

}
发表于 2022-10-04 18:13:34 回复(0)
四种方式,dp2最快,dfs慢点。bfs超内存,dp1和dp3超时。
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i< n;i++) {
                arr[i] = in.nextInt();
            }
            boolean b = dfs(arr);
            System.out.println(b);
        }
    }
    
    // dp 记录能到达的最大的index
    // 时间复杂度为n
    public static boolean dp2(int[] arr) {
        int n = arr.length;
        int dp = arr[0];
        for (int i = 1; i < n && i <= dp ; i++) {
            dp = Math.max(dp, arr[i] + i);
        }
        return dp >= n -1;
    }
    
    // 时间和arr元素的大小相关,当arr元素较小时,时间复杂度为O(n) = n
    public static boolean dp1(int[] arr) {
        int n = arr.length;
        boolean[] dp = new boolean[arr.length];
        dp[0] = true; 
        for (int i = 0; i<n; i++) {
            if (dp[i]) {
                for (int j= i+1; j <n && j <= i + arr[i]; j++) {
                    dp[j] = true;
                    if (j == arr.length -1) return true;
                }
            } else {
                break;
            }
        }
        return dp[arr.length -1];
    }
    
    // timeout
    // O(n) = n^2
    public static boolean dp3(int[] arr) {
        boolean[] dp = new boolean[arr.length];
        dp[0] = true;
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < i; j++) {
                dp[i] = dp[j] && (i-j<=arr[j]);
                if (dp[i]) break;
            }
        }
        return dp[arr.length-1];
    }
    
    public static boolean dfs(int[] arr) {
        
        return _dfs(arr, 0);
    }
    
     public static boolean _dfs(int[] arr, int idx) {
        if (idx == arr.length - 1) return true;
        int step = arr[idx];
         for (int i=idx+1; i<=idx+step&&i<arr.length;i++) {
             if (_dfs(arr, i)) return true;
         }
        return false;
    }
    
    
    
    
    // out of memory
    public static boolean bfs(int[] arr) {
        int len = arr.length;
        LinkedList<Integer> list = new LinkedList<>();
        list.add(0);
         
        boolean found = false;
        while (!list.isEmpty()) {
            int idx = list.removeFirst();
            if (idx == len - 1) return true;
            int step = arr[idx];
            for (int i = idx+1; i <= idx + step; i++) {
                list.add(i);
            }
        }
        
        return false;
    }
    
    
}


发表于 2022-03-24 15:23:28 回复(0)