LeetCode1871 跳跃游戏VII

LeetCode 跳跃游戏 IV:二进制字符串的跳跃问题

题目描述

给定一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump。初始时,你位于下标 0 处(保证该位置为 '0')。你需要判断是否能到达字符串的最后一个位置(下标为 s.length - 1)。移动规则如下:

  • 从位置 i 移动到 j,需满足 i + minJump ≤ j ≤ min(i + maxJump, s.length - 1)
  • 目标位置 j 必须为 '0'。

解题思路分析

动态规划 + 前缀和优化

核心思想
  1. 动态规划数组 dpdp[i] 表示是否能到达位置 i
  2. 前缀和数组 pre:记录从 0 到当前位置的可达状态总和,用于快速计算区间和。
  3. 有效区间:对于位置 j,其可跳跃的起始位置范围为 [j - maxJump, j - minJump]。通过前缀和数组快速判断该区间内是否有可达的位置。
关键步骤
  1. 初始化

    • 若最后一个字符为 '1',直接返回 false
    • dp[0] = true(初始位置可达)。
    • 前缀和数组 pre 记录可达位置的累计数量。
  2. 遍历每个位置 j

    • 若当前位置为 '1',跳过。
    • 计算可跳跃的起始位置范围 [left, right]
    • 利用前缀和数组快速查询该区间内是否有可达位置。
    • 更新 dp[j] 和前缀和数组 pre

代码实现

方法一:标准动态规划 + 前缀

class Solution {public boolean canReach(String s, int minJump, int maxJump) {int n = s.length();if (s.charAt(n - 1) != '0') return false;boolean[] dp = new boolean[n];dp[0] = true;int[] pre = new int[n + 1]; // pre[i] 表示前i个位置的可达数pre[1] = 1;for (int j = 1; j < n; j++) {if (s.charAt(j) != '0') {pre[j + 1] = pre[j];continue;}int left = j - maxJump;int right = j - minJump;left = Math.max(left, 0);right = Math.min(right, j - 1);if (left > right) {pre[j + 1] = pre[j];continue;}int sum = pre[right + 1] - pre[left];dp[j] = sum > 0;pre[j + 1] = pre[j] + (dp[j] ? 1 : 0);}return dp[n - 1];}
}

方法二:简化前缀和处理

class Solution {public boolean canReach(String s, int minJump, int maxJump) {int n = s.length();if (s.charAt(n - 1) != '0') return false;boolean[] dp = new boolean[n];dp[0] = true;int pre = 0; // 当前窗口内的可达数for (int i = 1; i < n; i++) {if (i >= minJump) pre += dp[i - minJump] ? 1 : 0;if (i > maxJump) pre -= dp[i - maxJump - 1] ? 1 : 0;dp[i] = s.charAt(i) == '0' && pre > 0;}return dp[n - 1];}
}

代码解释

方法一关键点

  1. 前缀和数组 pre

    • pre[i] 表示前 i 个位置(即索引 0 到 i-1)的可达数。
    • 通过 pre[right+1] - pre[left] 快速计算区间 [left, right] 的可达数。
  2. 有效区间计算

    • left = j - maxJumpright = j - minJump,确保区间不越界。
    • 若区间为空(left > right),则当前位置不可达。

方法二优化

  • 滚动窗口优化
    • 直接维护当前窗口内的可达数 pre,无需额外数组。
    • 当 i 超过 minJump 时,将 dp[i - minJump] 加入窗口。
    • 当 i 超过 maxJump 时,将 dp[i - maxJump - 1] 移出窗口。

复杂度分析

  • 时间复杂度O(n),每个位置仅遍历一次。
  • 空间复杂度O(n),需存储 dp 数组和前缀和数组(方法一)或仅 dp 数组(方法二)。

总结与优化

  1. 动态规划是核心:通过 dp 数组记录状态,避免重复计算。
  2. 前缀和优化:将区间查询复杂度从 O(n) 降至 O(1),大幅提升效率。
  3. 空间优化:方法二中仅需维护一个 pre 变量,进一步减少空间消耗。

扩展思考:若题目允许跳跃到 '1' 位置,但需额外条件(如跳跃次数限制),如何调整算法?

希望这篇博客对您有所帮助!如果需要进一步优化或补充细节,可以随时告诉我~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Burpsuite使用笔记

Burpsuite使用笔记 抓包设置代理open Browserintercept on输入要抓包的网站回车ForwardHTTP history查看抓包数据其他浏览器配置burpsuite代理浏览器代理器插件配置打开代理同样步骤访问原理三级目录抓包 设置代理 open Browser 打开内置浏览器 intercept on 输入要抓包的网…

Windows 远程桌面多端口访问,局域网虚拟IP映射多个Windows 主机解决方案

情景 项目现场4G路由局域网中两台主机通过VPN连接到公司内网&#xff0c;实现远程管理&#xff0c;要求映射两个Windows 桌面进行管理。 目录 情景 网络 思路 已知 问题解决 1.客户端通过VPN进入内网路由器配置NAT 2.使用远程主机远程桌面功能&#xff1a;IP端口号访问 …

【深度学习】读写文件

读写文件 到目前为止&#xff0c;我们讨论了如何处理数据&#xff0c;以及如何构建、训练和测试深度学习模型。 然而&#xff0c;有时我们希望保存训练的模型&#xff0c;以备将来在各种环境中使用&#xff08;比如在部署中进行预测&#xff09;。 此外&#xff0c;当运行一个…

仿Manus一

复制 ┌───────────────┐ ┌─────────────┐ │ 主界面UI │◄─────►│ 会话管理模块 │ └───────┬───────┘ └──────┬──────┘│ │▼ ▼ ┌─…

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…

Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能

Flutter 学习之旅 之 flutter 不使用插件&#xff0c;实现简单带加载动画的 LoadingToast 功能 目录 Flutter 学习之旅 之 flutter 不使用插件&#xff0c;实现简单带加载动画的 LoadingToast 功能 一、简单介绍 二、LoadingToast 三、简单案例实现 四、关键代码 一、简单…

Spring (八)AOP-切面编程的使用

目录 实现步骤&#xff1a; 1 导入AOP依赖 2 编写切面Aspect 3 编写通知方法 4 指定切入点表达式 5 测试AOP动态织入 图示&#xff1a; 一 实现步骤&#xff1a; 1 导入AOP依赖 <!-- Spring Boot AOP依赖 --><dependency><groupId>org.springframewor…

开源数字人模型Heygem

一、Heygem是什么 Heygem 是硅基智能推出的开源数字人模型&#xff0c;专为 Windows 系统设计。基于先进的AI技术&#xff0c;仅需1秒视频或1张照片&#xff0c;能在30秒内完成数字人形象和声音克隆&#xff0c;在60秒内合成4K超高清视频。Heygem支持多语言输出、多表情动作&a…

uniapp开通开屏广告后动态开启或关闭开屏广告

近期使用uniapp开发的APP有uniad的广告对接&#xff0c;并且要求会员用户不显示包含开屏广告在内的广告&#xff0c;除开屏广告外的广告都可以通过uniapp广告组件控制是否显示 因uniad的开屏广告无需代码开发&#xff0c;经过uniad客服指点可在App.vue中的onLaunch生命周期中执…

神经网络为什么要用 ReLU 增加非线性?

在神经网络中使用 ReLU&#xff08;Rectified Linear Unit&#xff09; 作为激活函数的主要目的是引入非线性&#xff0c;这是神经网络能够学习复杂模式和解决非线性问题的关键。 1. 为什么需要非线性&#xff1f; 1.1 线性模型的局限性 如果神经网络只使用线性激活函数&…

使用SSH密钥连接本地git 和 github

目录 配置本地SSH&#xff0c;添加到github首先查看本地是否有SSH密钥生成SSH密钥&#xff0c;和邮箱绑定将 SSH 密钥添加到 ssh-agent&#xff1a;显示本地公钥*把下面这一串生成的公钥存到github上* 验证SSH配置是否成功终端跳转到本地仓库把http协议改为SSH&#xff08;如果…

关于AI数据分析可行性的初步评估

一、结论&#xff1a;可在部分环节嵌入&#xff0c;无法直接处理大量数据 1.非本地部署的AI应用处理非机密文件没问题&#xff0c;内部文件要注意数据安全风险。 2.AI&#xff08;指高规格大模型&#xff09;十分适合探索性研究分析&#xff0c;对复杂报告无法全流程执行&…

矩阵分析-浅要理解(深度学习方向)

梯度分析与最优化 在深度学习的任务中&#xff0c;我们所期望的是训练一个神经网络&#xff0c;使得预测结果与真实标签之间的误差最小化&#xff0c;这可以近似看作是一个提供梯度下降等优化找到全局最优解的凸优化问题。 奇异值分解 在信息工程领域&#xff0c;对数据处理的…

使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏

前言&#xff1a;如今&#xff0c;借助先进的人工智能模型与便捷的云平台&#xff0c;即便是新手开发者&#xff0c;也能开启创意游戏的设计之旅。DeepSeek 作为前沿的人工智能模型&#xff0c;具备强大的功能与潜力&#xff0c;而蓝耘智算云平台则为其提供了稳定高效的运行环境…

固定表头、首列 —— uniapp、vue 项目

项目实地&#xff1a;也可以在 【微信小程序】搜索体验&#xff1a;xny.handbook 另一个体验项目&#xff1a;官网 一、效果展示 二、代码展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

【学习笔记】Numpy和Tensor的区别

1. NumPy 和 PyTorch Tensor 的格式对比 NumPy 使用的是 numpy.ndarray&#xff0c;而 PyTorch 使用的是 torch.Tensor&#xff0c;两者的格式在数据存储和计算方式上有所不同。 NumPy (numpy.ndarray) import numpy as np array np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.…

每天一道算法题【蓝桥杯】【在排序数组中查找元素的第一个位置和最后一个位置】

思路 本题为查找左边界和右边界的标准模型 查找左边界 int left 0, right nums.size() - 1, mid 0; //查找左边界 while (left < right) { mid left (right - left) / 2; if (nums[mid] < target) left mid 1; else right mid; } 查找右边界 int left 0, r…

Python数据分析之机器学习基础

Python 数据分析重点知识点 本系列不同其他的知识点讲解&#xff0c;力求通过例子让新同学学习用法&#xff0c;帮助老同学快速回忆知识点 可视化系列&#xff1a; Python基础数据分析工具数据处理与分析数据可视化机器学习基础 五、机器学习基础 了解机器学习概念、分类及…

我与DeepSeek读《大型网站技术架构》(10)- 维基百科的高性能架构设计分析

目录 网站整体架构核心组件请求处理流程图关键环节说明 性能优化策略前端优化&#xff1a;拦截 80% 以上请求服务端优化&#xff1a;高性能 PHP 集群后端优化&#xff1a;存储与缓存极致设计Memcached 持久化连接 性能优化策略对比表 网站整体架构 核心组件 Wikipedia 的架构…

Excel多级联动下拉菜单设置

1.问题描述 现有数据表如下图所示&#xff1a; 该表中包括省、市、县三级目录。 现要将其整理成数据表模板&#xff0c;如下图所示&#xff1a; 要求制作成下拉菜单的形式&#xff0c;且每一级目录的下拉菜单列表要根据上一级目录的内容来确定。 如上图所示&#xff0c;只有…