详细见:leetcode.com/problems/jump-game-ii
Java Solution: github
package leetcode;
/*
大致意思是:
从0开始跳,每次跳的步数 <= 当前的值
结果就是要跳到最后一个
求跳最少次数
*/
public class P045_JumpGameII {
/*
* 4 ms
* 13.87%
*/
static class Solution2 {
int jump(int[] nums) {
if (nums == null || nums.length < 2)
return 0;
int ans = 0, curMax = 0, curRch = 0;
for (int i = 0; i != nums.length; i++) {
if (curRch < i) {
ans ++;
curRch = curMax;
}
curMax = Math.max(curMax, nums[i] + i);
}
return ans;
}
}
}
C Solution: github
/*
url: leetcode.com/problems/jump-game-ii/
jump: 519ms 14.29%
jump2: 6ms 52.38%
*/
#include <stdio.h>
#include <stdlib.h>
int _min(int a, int b) {
return a < b ? a : b;
}
int _max(int a, int b) {
return a < b ? b : a;
}
int jump(int* n, int s) {
int* m = (int*) malloc(sizeof(int) * (s));
int i = 0, j = 0, mi = 0;
m[s-1] = 0;
for (i = s-2; i > -1; i --) {
mi = s;
for (j = i + 1; j < s && j - i <= n[i]; j ++) {
mi = _min(mi, m[j] + 1);
}
m[i] = mi;
}
//save ans to mi
mi = m[0];
free(m);
return mi;
}
int jump2(int* n, int s) {
int ans = 0, mti = 0, cri = 0, i = 0;
for (i = 0; i < s; i ++) {
if (cri < i) {
ans ++;
cri = mti;
}
mti = _max(mti, n[i] + i);
}
return ans;
}
int main() {
int n[] = {2, 3 ,1 ,1, 4};
int s = 5;
printf("answer is %d\r\n", jump2(n, s));
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/jump-game-ii
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年4月7日
@details: Solution: 65ms 68.96%
'''
class Solution(object):
def jump(self, n):
"""
:type n: List[int]
:rtype: int
"""
nn = 0 if n == None else len(n)
ans, mti, cur = 0, 0, 0
for i in range(nn):
if cur < i:
ans += 1
cur = mti
if cur>=nn-1:break
mti=max(mti,i+n[i])
return ans
if __name__ == "__main__":
n=[2,3,1,1,4]
print(Solution().jump(n))