# 跳跃游戏。 # 题目描述:给定一个数组,每个元素代表跳跃的距离,判断是否能从起点出发,跳到数组的末尾。 # 例如,给定数组[2,3,1,1,4],表示从起点出发,可以跳跃2步,跳到位置3,然后跳1步,跳到位置4,跳4步到达末尾。 # 思路: # 1. 遍历数组,对于每个位置,判断能否到达,如果能到达,则更新最远能到达位置。 # 2. 如果最远能到达位置大于等于数组长度-1,则说明可以到达末尾,返回True;否则返回False。 class Solution: def canJump(self, nums): max_distance = 0 # 用来记录当前能够到达的最远位置。 for i, jump in enumerate(nums): # 遍历数组nums,同时获取当前位置的索引i和该位置对应的跳跃长度jump # 如果当前位置超出了能够到达的最远位置,则无法继续跳跃 if i > max_distance: return False # 更新当前能够到达的最远位置,这里的max函数的作用是返回两个参数中的较大值。 max_distance = max(max_distance, i + jump) # 如果最远能够到达的位置已经超过了数组末尾,则可以直接返回True return max_distance >= len(nums) - 1 if __name__ == '__main__': list_nums = [3, 3, 1, 1, 4] print(Solution().canJump(list_nums)) # 对于数组[3, 3, 1, 1, 4],从位置0出发,可以跳到位置3,然后跳1步,跳到位置4,跳4步到达末尾。 # 因此,返回True。 list_nums = [3, 2, 1, 0, 4] print(Solution().canJump(list_nums)) # 无法从位置0跳到位置3,因为nums[0] = 3,加上当前位置0,并不能到达末尾,因此返回False。 # 简单来讲,只要当前位置加上跳转的位置能够超过或者到达最远的位置,就说明可以到达末尾,否则就返回False。 # 利用贪心算法来判断是否能够从数组的第一个位置跳跃到最后一个位置。 # 每一步都尽可能地更新能够到达的最远位置,从而避免检查所有可能的跳跃路径。 # 时间复杂度:O(n),代码遍历了数组nums一次,没有嵌套循环或其他会增加时间复杂度的操作。因此,时间复杂度是O(n),其中n是数组nums的长度。 # 空间复杂度:O(1),代码中只使用了几个变量(如max_distance和i)来追踪当前能够到达的最远位置和当前位置。 # 这些变量不随数组nums的大小变化而增加,因此空间复杂度是O(1)。
通过python,实现跳跃游戏,涉及贪心算法
最新推荐文章于 2024-07-17 16:18:44 发布