给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度。如果能够跳到数组最后一个位置,则输出true,否则输出false。
数据范围:
第一行输入一个正整数 n ,表示数组 nums 的长度第二行输入 n 个整数表示数组的每个元素
输出 true 或者 false
7 2 1 3 3 0 0 100
true
首先位于nums[0]=2,然后可以跳2步,到nums[2]=3的位置,再跳到nums[3]=3的位置,再直接跳到nums[6]=100,可以跳到最后,输出true
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); } }
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; } }