这是我参与更文挑战的第1天,活动详情查看: 更文挑战
最近准备刷一段时间题,在此记录一些经典题型,每天更新
今天刷题第一天:
序号:45
难度:中等
题目:跳跃游戏 II
链接:leetcode-cn.com/problems/ju…
规则: 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 1000
0 <= nums[i] <= 105
解题思路:
第一眼很重要:贪心算法
因为每一步的最大下一跳的数,一定包含其他的数,因为它跳的最远,也就是涵盖了所有结果
代码
class Solution:
def jump(self, nums: List[int]) -> int:
""" 贪心算法 """
"""
n 长度
num 步长
left ,right 当前位置元素能到达的第一个元素和最后一个元素
cur 当前位置的元素
"""
n = len(nums)
num = 0
left, right, cur = 0, 0, 0
# 1. 当元素个数为1 直接返回
if len(nums) == 1:
return 0
# 2. 循环
while left < n:
# 1. 每次更新当前元素的 left, right
left = right + 1
right = cur + nums[cur]
# 4. 如果 right 值大于 n-1了,说明下一步一定能到,返回
if right >= n-1:
return num + 1
# 2. 根据贪心算法,找到能走的最远的 下一个元素
temp = 0
for i in range(left, right+1):
if i + nums[i] > temp:
temp = i + nums[i]
cur = i
# 3. 步数加一
num += 1