题目:给定数组arr,其中arr[i]==k表示从位置i最多能向右跳k个距离。如果从位置0出发,最少跳几次能跳到arr最后的位置上。
例:
arr=[3,2,3,1,1,4]
arr[0]=3,跳两次到位置2,arr[2]=3跳3次到达最后位置。因此最少跳两次。
要求:若arr长度为N,要求时间复杂度为O(N),额外空间复杂度为O(1)。
实现:
- 定义3个int型变量jump、cur、next,其中
jump表示目前跳了多少步;
cur表示跳了jump步后,最远能达到的位置;
next表示如果再多跳一步,最远能达到的位置。 - 遍历数组
1)如果cur>=i,说明跳jump步可以到达i,此时什么也不用做。
2)如果cur<i,说明跳jump步不能到达i,此时需要jump++,cur=next。表示多跳了一步,cur更新成跳jump+1位置最远能达到的位置,即next的值。 - 将next更新为多跳一步,最远能达到的位置,即next=max{next,i+arr[i]}。
1 | public int jump(int[] arr){ |