当前位置: 首页 > news >正文

LeetCode 热题 100_跳跃游戏 II(79_45_中等_C++)(贪心算法)

LeetCode 热题 100_跳跃游戏 II(79_45)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(贪心选择):
      • 代码实现
        • 代码实现(思路一(贪心算法)):
        • 以思路一为例进行调试

题目描述:

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

输入输出样例:

示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2

提示:
1 <= nums.length <= 104
0 <= nums[i] <= 1000
题目保证可以到达 nums[n-1]

题解:

解题思路:

思路一(贪心选择):

1、本题思想是:当前需跳跃的位置,取决跳跃到的位置是否能跳的最远。
例: nums=[2,3,1,2,4,2,3]
从nums[0]=2开始跳跃,可跳跃到nums[1],nums[2] (统计开始跳跃点)。

  • 若其跳到nums[1]=3,可通过此结点最远跳到nums[1+3]
  • 若其跳到nums[2]=1,可通过此结点最远跳到nums[2+1]
  • 所以我们选择跳跃到nums[1]

从nums[1]=3开始跳跃,可跳跃到nums[3],nums[4] (nums[2]不如nums[1]跳的远,无需考虑)(统计开始跳跃点)。

  • 若其跳到nums[3]=2,可通过此结点最远跳到nums[3+2]
  • 若其跳到nums[4]=4,可通过此结点最远跳到nums[4+4]
  • 所以我们选择跳跃到nums[4]

从nums[4]=4开始跳跃,可跳跃到nums[5],nums[6](可跳跃到最后一个结点nums[ 6],算法结束)(统计开始跳跃点)。

2、复杂度分析:
① 时间复杂度:O(n),其中 n 是数组长度。
② 空间复杂度:O(1)。

代码实现

代码实现(思路一(贪心算法)):
class Solution {
public:
    int jump(vector<int>& nums) {
        int ans = 0;  // 记录跳跃次数(也就是开始跳跃的点)
        int cur_right = 0;  // 当前能到达的最远位置
        int next_right = 0;  // 下一跳能到达的最远位置

        // 遍历数组中的每个元素,跳跃目标是尽可能向前跳
        for (int i = 0; i < nums.size() - 1; i++) {
            next_right = max(next_right, i + nums[i]);  // 更新能到达的最远位置

            // 如果当前位置是当前跳跃的最远位置,说明需要跳跃一次
            if (i == cur_right) {
                cur_right = next_right;  // 更新当前最远跳跃位置
                ans++;  // 增加跳跃次数
            }
        }
        return ans;  // 返回总跳跃次数
    }
};
以思路一为例进行调试
#include<iostream>
#include <vector>
using namespace std;

class Solution {
public:
    int jump(vector<int>& nums) {
        int ans = 0;  // 记录跳跃次数(也就是开始跳跃的点)
        int cur_right = 0;  // 当前能到达的最远位置
        int next_right = 0;  // 下一跳能到达的最远位置

        // 遍历数组中的每个元素,跳跃目标是尽可能向前跳
        for (int i = 0; i < nums.size() - 1; i++) {
            next_right = max(next_right, i + nums[i]);  // 更新能到达的最远位置

            // 如果当前位置是当前跳跃的最远位置,说明需要跳跃一次
            if (i == cur_right) {
                cur_right = next_right;  // 更新当前最远跳跃位置
                ans++;  // 增加跳跃次数
            }
        }
        return ans;  // 返回总跳跃次数
    }
};

int main(int argc, char const *argv[])
{
    
    vector<int> nums={2,3,0,1,4};
    Solution s;
    cout<<s.jump(nums);
    return 0;
}

LeetCode 热题 100_跳跃游戏 II(79_45)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

相关文章:

  • RPA+AI 技术到底好在哪里?
  • 深度学习框架对比评测:TensorFlow、PyTorch、PaddlePaddle与MXNet的技术演进与应用实践
  • CUDA与cuDNN 的介绍
  • 从零开始实现Stable Diffusion本地部署
  • HTML图像标签的详细介绍
  • 火绒终端安全管理系统V2.0——行为管理(软件禁用+违规外联)
  • 如何为AI开发选择合适的服务器?
  • 用curl和python通过网络测试Ollama服务器的配置和状态
  • Kafka分区分配策略详解
  • Java基础面试知识路线
  • Hibernate Validation 注解全面教程
  • 批量删除 PPT 文档中的宏
  • TensorFlow之Session
  • 【嵌入式学习】记忆电路 - 锁存器
  • 基于springboot的旅游网站(013)
  • 210、【图论】课程表(Python)
  • Python标准库之sys模块
  • 初入ARM,点灯,按键与中断相结合
  • 【Rust】集合的使用——Rust语言基础16
  • Linux笔记之Ubuntu22.04安装IBus中文输入法教程
  • 网站开发网站设计的标准/2021年关键词排名
  • 出口网站有哪些/seo百度网站排名软件
  • 网站是什么意思例如/网址域名大全2345网址
  • 做网站 信科网络/网络营销方案的范文
  • 日ip 1万 网站 值多少钱/网站怎么收录到百度
  • 阿里巴巴全球速卖通/关键词优化怎么操作