LeetCode 刷题之旅(2020.04.17)

LeetCode 刷题之旅(2020.04.17)——跳跃游戏(中)

题目:

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 13 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

模板代码(python3):

class Solution:
    def canJump(self, nums: List[int]) -> bool:

解题思路:

  • 从终点出发,向前寻找。
  • 链表的距离与元素的值之间大小关系。
  • 类似遍历最优路径或最优解的思想。
  • 类似状态转移的思想。

以示例1为例:
List = [2, 3, 1, 1, 4]

显然,列表最后一位元素 “4” 对问题没有影响。
元素 “4” 到与其相邻的元素 “1” 的距离为1,与间隔一位的元素 “1” 的距离为2,以此类推。

问题转化为:

以最后一位元素 “4” 为起始点,向前遍历,找到与元素 “4” 的距离小于该元素值的路径点,并以此路径点为下一状态的起始点向前遍历,直到找到一条路径可以到达第一个元素 “2”。

解法:

  1. 非贪心算法:
def canJump(self, nums: List[int]) -> bool:
    if len(nums) <= 1:
	    return True
    nums.reverse()
    sign = 0
    for i in range(1, len(nums)):
    	if nums[i] >= i - sign:
    		sign = i
    		continue
    if sign == len(nums) - 1:
    	return True
    else:
    	return False
  1. 贪心算法:
def canJump(self, nums: List[int]) -> bool:
	sign = 0
	for i in range(len(nums)):
		if i <= sign:
			sign = max(sign, i + nums[i])
			if sign >= len(nums) - 1:
				return True
	return False

算法复杂度分析:

两种算法时间复杂度均为 O(N),空间复杂度均为 O(1)

你可能感兴趣的:(LeetCode每日一题)