给你一个长度为 n 的数组 a。
ai 表示从 i 这个位置开始最多能往后跳多少格。
求从 1 开始最少需要跳几次就能到达第 n 个格子。
数据范围: ,
进阶: 空间复杂度 , 时间复杂度
进阶: 空间复杂度 , 时间复杂度
2,[1,2]
1
从1号格子只需要跳跃一次就能到达2号格子
3,[2,3,1]
1
从1号格子只需要跳一次就能直接抵达3号格子
//首先计算当前最远可到达位置(记为cur),如果当前位置i已经在上一个最远可到达位置(pre), //说明下一步一定能够到达cur,此时steps加一,同时跟新pre的值。 //七刷,这题思路太强了 public int Jump (int n, int[] A) { //前一个最远可到达位置 int pre=0; //当前最远可到达位置 int cur=0; //步数 int steps=0; //因为在pre处steps就加一,所以循环只需执行到索引n-2处 ???六刷时候没搞懂为啥n-1??? for(int i=0;i<n-1;i++){ cur=Math.max(cur,i+A[i]); //如果到达前一个最远可到达位置,说明下一步就可以到当前目标位置 if(i==pre){ pre=cur; steps++; } } return steps; }
function Jump( n , A ) { // write code here let end = 0, farthest = 0,stepNum = 0,len = A.length-1 for(let i = 0;i<len;i++){ farthest = Math.max(farthest, i + A[i]) if(end>=n) break if(end == i){ end = farthest stepNum++ } } return stepNum }
package main /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 最少需要跳跃几次能跳到末尾 * @param n int整型 数组A的长度 * @param A int整型一维数组 数组A * @return int整型 */ func Jump( n int , A []int ) int { var pre,cur,steps int for i,x:=range A{ if i==n-1{ break } cur=max(cur,i+x) if pre==i{ pre=cur steps++ } } return steps } func max(a,b int)int{ if a>b{ return a } return b }
public int Jump (int n, int[] A) { // write code here int[] f = new int[n]; //贪心取j for (int i = 0, j = 0; i < n; i++) { f[i] = i; for (; j < i; j++) { if (A[j] + j >= i) { f[i] = Math.min(f[i], f[j] + 1); break; } } } return f[n - 1]; } //每次的j不需要从头开始,从上次位置开始即可,因为在此之间无法到达i,就必然无法到达i+1
class Solution: def Jump(self , n: int, A: List[int]) -> int: # write code here pre = 0#前一个最远可到达位置 cur = 0#当前可达最远位置 steps = 0#总步数 for i in range(0,n): cur = max(cur,i+A[i]) if(i == pre): pre = cur steps += 1 if(pre>=n-1): break #print(steps) return steps
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 最少需要跳跃几次能跳到末尾 # @param n int整型 数组A的长度 # @param A int整型一维数组 数组A # @return int整型 # class Solution: def Jump(self , n: int, A: List[int]) -> int: # write code here #递归 if n==1: return 1 if A[0]>1 else 0 if len(set(A))==1 and A[0]==1: return n-1 step=[] def jumps(i): if i+A[i]>=n-1: return step.append(1) else: v=0 s=i for j in range(i+1,i+A[i]+1): if A[j]-A[i]-i+j>v: v=A[j]-A[i]-i+j s=j step.append(1) if s+A[s]<=n-1: jumps(s) elif s==n-1: return else: return step.append(1) jumps(0) return sum(step)
int Jump(int n, vector<int>& A) { // write code here //跳跃游戏 int curDistance=0; int nextDistance=0; int res=0; for(int i=0;i<n;i++) { nextDistance=max(nextDistance,i+A[i]); if(curDistance==i) { if(curDistance==n-1) break; else { res++; curDistance=nextDistance; if(curDistance>=n-1) break; } } } return res; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 最少需要跳跃几次能跳到末尾 * @param n int整型 数组A的长度 * @param A int整型一维数组 数组A * @return int整型 */ public int Jump (int n, int[] A) { // write code here int far = 0, count = 0, end = 0; for(int i = 0; i < n - 1; i ++){ far = Math.max(far, i + A[i]); if(i == end){ end = far; count ++; } } return count; } }
class Solution { public: int Jump(int n, vector<int>& A) { int reach=A.size()-1; int steps=0; while(reach!=0){ int i=0; while(i+A[i]<reach){ i++; } // finally, i+A[i]>=reach if(i==0) return steps+1; reach=i; steps+=1; } return steps; } };