给定一个非负整数数组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); } }
#include <iostream> using namespace std; int main() { int n; cin>>n; int right = 0, flag=0; for(int i=0; i<n; i++){ if(i>right) break; if(right>n-2){ flag = 1; break; } int x; cin>>x; right = max(right, i+x); } cout<< (flag==1 ? "true" : "false"); return 0; }
#include <iostream> #include <vector> using namespace std; bool dp26() { // freopen("1.txt", "r", stdin); int n, tmp, a0, a1; cin >> n; if (n == 1) { cout << "true"; return true; } cin >> tmp; a0 = tmp; for (int i = 1; i < n; i++) { cin >> tmp; if (a0 < i) { cout << "false"; return false; } else if (a0 >= n - 1){ cout << "true"; return true; }else { a1 = max(i + tmp, a0); a0 = a1; } } return false; } int main() { dp26(); return 0; }
Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] nums = new int[n]; int[] dp = new int[n]; dp[0] = in.nextInt(); for (int i = 1; i < n; i++) { int num = in.nextInt(); if (dp[i - 1] < i) { dp[n - 1] = 0; //达不到 , 直接结束. break; } dp[i] = Math.max(dp[i - 1], i + num); } System.out.println(dp[n - 1] >= n - 1);
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int n=in.nextInt(); int[] arr=new int[n]; for(int i=0;i<n;i++) arr[i]=in.nextInt(); int res=0; for(int i=0;i<n;i++){ if(i<=res){ res=Math.max(res,i+arr[i]); if(res>=n-1){ System.out.println(true); System.exit(0); } } } System.out.println(false); } }
n = int(input()) nums = [int(x) for x in input().split()] if n ==1: print('true') else: dp = [False]*n target = n-1 for i in range(n-2,-1,-1): if target-i <= nums[i]: target = i dp[i] = True continue print(str(dp[0]).lower())
#include<bits/stdc++.h> using namespace std; string JumpGame(int n,vector<int>&nums){ int cover =0; for(int i=0;i<=cover;i++){ cover =max(i+nums[i],cover); if(cover>=n-1)return "true"; } return "false"; } int main(){ int n; cin>>n; vector<int> nums(n); for(int i=0;i<n;i++){ cin>>nums[i]; } cout<<JumpGame(n,nums); return 0; }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n; cin>>n; vector<int> a; int b; for(int i=0;i<n;i++) { cin>>b; a.push_back(b); } if(a[0]==0 && a.size()!=1) { cout<<"false"<<endl; return 0; } //每步判断,跳跃距离递减 vector<int> dp(n+1,0); dp[1]=1; int temp=0; for(int i=2;i<=n+1;i++) { temp=max(temp,a[i-2]); if(dp[i-1]==1) { dp[i]=temp>=1? 1:0; temp=temp-1; } else { cout<<"false"<<endl; return 0; } } cout<<"true"<<endl; return 0; }
#include<bits/stdc++.h> using namespace std; string canJump(vector<int>&nums,int n){ int farthest=0; for(int i=0;i<n;i++){ if(i<=farthest){ farthest=max(farthest,i+nums[i]); if(farthest>=n-1){ return "true"; } } } return "false"; } int main(){ int n;cin>>n; vector<int>nums(n); for(int i=0;i<n;i++) cin>>nums[i]; cout<<canJump(nums,n); }
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; } }