跳跃问题

# 给出一个数组,使用Python判断这个数组能不能走到底,每一步要走的步数是每个数据索引下的值
# 贪心算法


def can_jump(nums):
    if not nums:  # 处理空数组的情况
        return False

    if len(nums) == 1:  # 处理只有一个元素的情况
        return True

    max_reach = 0  # 能到达的最远位置

    # 遍历数组中的每个位置,注意这里只需要遍历到倒数第二个位置
    for i in range(len(nums) - 1):
        # 如果当前位置已经超过了能到达的最远位置,返回False
        if i > max_reach:
            return False

        # 更新能到达的最远位置
        max_reach = max(max_reach, i + nums[i])

        # 如果已经能够到达最后一个位置,提前返回True
        if max_reach >= len(nums) - 1:
            return True

    return max_reach >= len(nums) - 1


# 动态规划算法
def can_jump_dp(nums):
    n = len(nums)
    # dp[i] 表示是否能够到达位置i
    dp = [False] * n
    dp[0] = True  # 起始位置可以到达

    for i in range(n):
        if dp[i]:  # 如果当前位置可以到达
            # 从当前位置可以跳跃的所有位置
            for j in range(1, nums[i] + 1):
                if i + j < n:
                    dp[i + j] = True
                if i + j >= n - 1:  # 如果能够到达或超过最后一个位置
                    return True

    return dp[n - 1]  # 返回是否能到达最后一个位置


# 测试用例
test_cases = [
    [2, 3, 1, 1, 4],  # True  - 可以跳 2 步到位置 2,然后跳 1 步到位置 3,最后跳 1 步到位置 4
    [3, 2, 1, 0, 4],  # False - 无法跳过位置 3 的 0
    [1, 1, 1, 0],  # True  - 可以一步一步跳到最后
    [0],  # True  - 已经在终点
    [1, 0],  # True  - 可以跳一步到达终点
    [0, 1],  # False - 第一个位置是 0,无法继续
]

for nums in test_cases:
    result = can_jump(nums)
    print(f"数组 {nums} {'可以' if result else '不可以'}到达最后一个位置") 

  

posted @ 2024-12-19 16:20  Adamanter  阅读(19)  评论(0)    收藏  举报