找终点
题目描述
给定一个正整数数组, 设为nums, 最大为100个成员, 求从第一个成员开始, 正好走到数组最后一个成员, 所使用的最少步骤数.
要求:
- 第一步必须从第一元素开始, 且1<=第一步的步长<len/2; (len为数组的长度, 需要自行解析)
- 从第二步开始, 只能以所在成员的数字走相应的步数, 不能多也不能少, 如果目标不可达返回
-1
, 只输出最少的步骤数量 - 只能向数组的尾部走, 不能往回走
输入描述
由正整数组成的数组, 以空格分隔, 数组长度小于100, 请自行解析数据数量.
输出描述
正整数, 表示最少的步数, 如果不存在输出 -1
.
示例1
输入:
7 5 9 4 2 6 8 3 5 4 3 9
输出:
2
说明:
- 第一步: 第一个可选步长选择2, 从第一个成员7开始走2步, 到达9
- 第二步: 从9开始, 经过自身数字9对应的9个成员到最后
示例2
输入:
1 2 3 7 1 5 9 3 2 1
输出:
-1
题解
Python
def main():
def get_steps(first_step):
print("first step:", first_step)
pos = 0 + first_step
count = 0
last_pos = num_len - 1
while pos < last_pos :
print(" pos:", pos, " +step:", nums[pos])
pos += nums[pos]
count += 1
if pos == last_pos:
print(" got end pos:", last_pos)
return count
else:
return None
# 先解析每个位置对应的步数
nums = list(map(int, input().split()))
num_len = len(nums)
if num_len % 2 == 0:
max_first_step = num_len // 2
else:
max_first_step = (num_len - 1) // 2 + 1
# Brute force
# 唯一变化的就是第一步的步长, 我们遍历它所有可能的步长
all_steps = []
for first_step in range(1, max_first_step):
num_steps = get_steps(first_step)
if num_steps:
all_steps.append(num_steps)
if not all_steps:
print(-1)
return
# 对所有步长进行排序, 然后找到最小的步数
all_steps.sort()
print(all_steps[0])
if __name__ == "__main__":
main()