计蒜客 第十九题 跳跃游戏二

给定一个非负整数数组,假定你的初始位置为数组第一个下标。

数组中的每个元素代表你在那个位置能够跳跃的最大长度。

你的目标是到达最后一个下标,并且使用最少的跳跃次数。

例如:

A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2。(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,到达最后一个下标。一共两次)

输入格式

第一行输入一个正整数 n(1≤n≤100) ,接下来的一行,输入 n 个整数,表示数组 A。

输出格式

最后输出最少的跳跃次数。

样例输入

5
3 1 1 1 1
样例输出

2

这题花了很长时间,实在没有思路,去看了下别人的做法,看到了关于边界的说法,然后开始自己尝试这种思路

a = int(input())
B = input().split()
j = 0
# 判断B的长度
while len(B) > 1: 
    X = []
    # 判断B的长度和第一个元素的大小
    while int(B[0]) < len(B) - 1: 
        #循环得到之后每一步的最大边界
        for b in range(1, int(B[0])+1): 
            X.append(int(B[b]) + b)
        # 得到边界最大的元素下标
        max_index = X.index(max(X)) 
        # 把之前的脚步抹去
        B = B[max_index+1:]
        # 计步数
        j = j + 1
        break
    else:
        print(j + 1, end="")
        B = []
else:
    # 如果B的长度等于 1 输出 0
    if len(B) == 1:
        print(0)

然后又想了想把不抹脚印方式

a = int(input())
B = input().split()
j = 0
i = 0
# 判断所在位置的元素是否能一步走到
while len(B)-1 > int(B[i]) + i:
    X = []
    #循环得到之后每一步的最大边界
    for b in range(1, int(B[i])+1):  
        X.append(int(B[i+b]) + b)
    # 得到边界最大的元素下标
    max_index = X.index(max(X)) 
    # 走一步,并记录位置
    i = i + max_index + 1
    j = j + 1
else:
    # 如果B的长度为 1 输出 0
    if len(B) == 1 :
        print(0)
    else:
        print(j+1)

你可能感兴趣的:(计蒜客 第十九题 跳跃游戏二)