算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

  • 动态规划

    • 爬楼梯
    • 零钱兑换
    • 最长递增子序列
    • 最长公共子序列
    • 单词拆分
    • 组合总和
    • 打家劫舍
    • 打家劫舍 II
    • 解码方法
    • 不同路径
    • 跳跃游戏
      • 题目描述
      • 知识回顾
      • 思路解析
      • C++代码
      • 复杂度分析
  • 图

  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

  • 堆

  • 逻辑思维

  • 目录
  • 动态规划
华南溜达虎
2024-07-08
目录

跳跃游戏

题目链接: https://leetcode.cn/problems/jump-game/

# LeetCode 55. 跳跃游戏

# 题目描述

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

举个例子:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

# 知识回顾

贪心算法是一种常见的算法思想,它通常用于解决优化问题。贪心算法的基本思想是,在每一步选择中都采取当前状态下最优的选择,从而希望最终得到全局最优解。

# 思路解析

本题是一道贪心算法应用的经典问题。应用贪心算法的关键就是每一步都采取当前状态下的最优选择。

本题的算法如下:

  1. 逆序遍历nums,target=nums.size()。
  2. 遍历到索引i,跳nums[i]步,i + nums[i] >= target说明子目标可达,此时更新target = i。
  3. 最终target == 0说明总目标可达。

上述步骤把总目标拆解成一个个子目标,为达成每个子目标都采取当下能跳的最大长度,这就很符合贪心的每一步都采取当前状态下的最优选择这个原则。

# C++代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int nums_len = nums.size();
        //初始化目标值
        int target = nums_len - 1;
        for (int i = nums_len - 1; i >=0; --i) {
            //当前目标可达,更新目标
            if (i + nums[i] >= target) {
                target = i;
            }
        }

        if (target == 0) {
            return true;
        }
        return false;
    }
};

# 复杂度分析

时间复杂度: O(n),n为nums的长度。

空间复杂度: O(1)。

上次更新: 2024/07/28, 17:12:00
不同路径
克隆图

← 不同路径 克隆图→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式