坚持每日刷题leedcode

203 阅读1分钟

这是我参与更文挑战的第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