[LeetCode 1696] 跳跃游戏 6(Ⅵ)
题面:
LeetCode 1696

数据范围:
1 ≤ n u m s . l e n g t h , k ≤ 1 0 5 1 \le nums.length, \ k \le 10^5 1≤nums.length, k≤105
− 1 0 4 ≤ n u m s [ i ] ≤ 1 0 4 -10^4 \le nums[i] \le 10^4 −104≤nums[i]≤104
思路 & Code
重点: 可以从下标 i i i 跳到 [ i + 1 , m i n ( n − 1 , i + k ) ] [i+1,min(n-1,i+k)] [i+1,min(n−1,i+k)] 区间内的任意一点;得分是所跳到路径的 n u m s nums nums 总和;要求最大得分。
首先自然想到动态规划:设 f [ i ] f[i] f[i] 维护到点 i i i 的最大得分,则 f [ i ] f[i] f[i] 必然是由 j ∈ { 0 , 1 , . . . p ( p < i ) } j\in \{0,1,...p\ (p<i)\} j∈{0,1,...p (p<i)} 中的一个 f [ j ] f[j] f[j] 转移过来的,并且 j + k ≥ i j+k\ge i j+k≥i。直接暴力DP呢,包超的, O ( n 2 ) O(n^2) O(n2)。
但如果只记录前序的最大值 m a x S c o r e maxScore maxScore,却无法判定得到该值的下标 p r e pre pre 是否能够跳到当前点 i i i。
接下来就得想优化策略啦。
1. DP + 最大堆
时间复杂度: O ( n l o g k ) O(nlogk) O(nlogk)
空间复杂度: O ( n ) O(n) O(n)
因为要求最大得分,又是根据前置路径来更新贡献的,所以可以很自然地想到用最大堆去维护前序最大得分,且从下标 0 0 0 开始顺序遍历(保证当前点 i i i 的答案是从前序点过来的)。由于有步长限制 k k k,我们必须判断获得最大得分的点 p r e pre pre 是否能够跳到当前点 n o w now now,如果其不能跳到,则说明后续所有点的贡献里都不会有 p r e pre pre 点的贡献。
故可以用 p a i r ( m a x S c o r e , i n d e x ) pair(maxScore, index) pair(maxScore,index) 来作为最大堆的元素。
Code:
int maxResult(vector<int>& nums, int k) {int n =nums.size();priority_queue<pair<int, int>> q; //优先队列维护最大堆q.push({nums[0], 0});for(int i = 1; i < n; ++i) {//筛选能跳到当前点的最大贡献while(!q.empty() && q.top().second < i - k) q.pop();//更新最大堆q.push({q.top().first + nums[i], i});}while(!q.empty() && q.top().second != n-1) q.pop();return q.top().first;
}
2. DP + 双端队列维护滑动窗口
这就不得不提到非常经典的一道题了 LeetCode 239 滑动窗口最大值
时间复杂度: O ( n ) O(n) O(n)
上面提到只存前序最大值而没有其下标是不行的。这边可以想到用滑动窗口去维护 { i − k , i − k + 1 , . . . , i − 1 } \{i-k,i-k+1,...,i-1\} {i−k,i−k+1,...,i−1} 总共 k k k 个 “最大值”。滑动窗口从队首到队尾的索引依次增大,但是对应的值依次递减,即对于队列 { r 1 , r 2 , . . . , r n } \{r_1, r_2, ..., r_n\} {r1,r2,...,rn},一定有 d p [ r 1 ] > d p [ r 2 ] > . . . > d p [ r n ] dp[r_1] > dp[r_2] > ... > dp[r_n] dp[r1]>dp[r2]>...>dp[rn],且 { r 1 < r 2 < r 3 < . . . < r n } \{ r_1 < r_2 < r_3 <... < r_n \} {r1<r2<r3<...<rn}。
遍历时,需要动态维护滑动窗口:
- 当滑动窗口的左边界(最小下标)已经跳不到当前点了,则直接剔除。
- 滑动窗口内只保留贡献(最大值)比当前点还大的元素,其他全部剔除。这是由于如果滑动窗口内小于等于当前点贡献的元素,对后续是一定没有贡献的。假设 d p [ j ] ≤ d p [ i ] , j ∈ { i − k , i − k + 1 , . . . , i − 1 } dp[j] \le dp[i]\ ,j \in \{ i-k, i-k+1,...,i-1\} dp[j]≤dp[i] ,j∈{i−k,i−k+1,...,i−1},首先在滑动窗口向右移动的时候 d p [ j ] dp[j] dp[j] 一定是先被踢出窗口的;其次,当要取到最大值 d p [ i ] = = d p [ j ] dp[i] == dp[j] dp[i]==dp[j] 的时候,由于 i > j i > j i>j, d p [ i ] dp[i] dp[i] 一定是比 d p [ j ] dp[j] dp[j] 能贡献到更后面的下标的(也就是 i i i 跳的比 j j j 远),所以只保留 i i i 即可。
- 将当前点的贡献和下标一起加入滑动窗口末尾
Code:
int maxResult(vector<int>& nums, int k) {int n = nums.size(), maxScore = 0;deque<pair<int, int>> dq;dq.emplace_back(nums[0], 0);maxScore = nums[0];for(int i = 1; i < n; ++i) {if(dq.front().second < i - k) dq.pop_front();maxScore = dq.front().first + nums[i];while(!dq.empty() && maxScore >= dq.back().first)dq.pop_back();dq.emplace_back(maxScore, i);}return maxScore;
}
相关文章:
[LeetCode 1696] 跳跃游戏 6(Ⅵ)
题面: LeetCode 1696 数据范围: 1 ≤ n u m s . l e n g t h , k ≤ 1 0 5 1 \le nums.length, \ k \le 10^5 1≤nums.length, k≤105 − 1 0 4 ≤ n u m s [ i ] ≤ 1 0 4 -10^4 \le nums[i] \le 10^4 −104≤nums[i]≤104 思路 & Code 重点&…...
在思科模拟器show IP route 发现Gateway of last resort is not set没有设置最后的通道
如果在show ip route的时候出现没有设置最后的通道Gateway of last resort is not set Switch#show ip route Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGPD - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter areaN1 - OSPF NSSA exte…...
Redis 常问知识
1.Redis 缓存穿透问题 缓存穿透:当请求的数据在缓存和数据库中不存在时,该请求就跳出我们使用缓存的架构(先从缓存找,再从数据库查找、这样就导致了一直去数据库中找),因为这个数据缓存中永远也不会存在。…...
履带小车+六轴机械臂(2)
本次介绍原理图部分 开发板部分,电源供电部分,六路舵机,PS2手柄接收器,HC-05蓝牙模块,蜂鸣器,串口,TB6612电机驱动模块,LDO线性稳压电路,按键部分 1、开发板部分 需要注…...
多卡集群 - Docker命令来启动一个容器的实例
一、Docker下载安装及相关配置 桌面版:Docker Desktop: The #1 Containerization Tool for Developers | Docker 服务器版:Install | Docker Docs 我们先以windows桌面版为例进行安装,一般在公司里会使用服务器版本,后期也会出一…...
测试第三课-------自动化测试相关
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
【C++教程】进制转换的实现方法
在C中进行进制转换可以通过标准库函数或自定义算法实现。以下是两种常见场景的转换方法及示例代码: 一、使用C标准库函数 任意进制转十进制 #include <string> #include <iostream>int main() {std::string num "1A3F"; // 十六进制数int…...
科普:如何通过ROC曲线,确定二分类的“理论阈值”
在二分类问题中,已知预测概率(如逻辑回归、神经网络输出的概率值)时,阈值的选择直接影响分类结果(正/负样本判定)。 一、实践中的阈值选择方法 1. 基于业务目标的调整 最大化准确率:适用于样…...
ebpf: CO-RE, BTF, and Libbpf(二)
本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。 本文涉及源码也来自于书中对应的github:https://github.com/lizrice/learning-ebpf/ 概述 上篇文章主要讲了CO-RE最关键的一环:BTF,了解其如何记录内核中的数据结…...
祁连山国家公园shp格式数据
地理位置 祁连山国家公园位于中国西北部,横跨甘肃省与青海省交界处,主体处于青藏高原东北边缘。总面积约5.02万平方公里,是中国首批设立的10个国家公园之一。 设立背景 保护措施 文化与历史 旅游与教育 意义与挑战 祁连山国家公园的设立标志…...
《AI大模型应知应会100篇》 第16篇:AI安全与对齐:大模型的灵魂工程
第16篇:AI安全与对齐:大模型的灵魂工程 摘要 在人工智能技术飞速发展的今天,大型语言模型(LLM)已经成为推动社会进步的重要工具。然而,随着这些模型能力的增强,如何确保它们的行为符合人类的期…...
探索QEMU-KVM虚拟化:麒麟系统下传统与云镜像创建虚拟机的最佳实践
随着云计算和虚拟化技术的不断进步,虚拟化在管理服务器、隔离资源以及提升性能方面的好处越来越明显。麒麟操作系统Kylin OS是我们国家自己开发的操作系统,在政府机构和企业中用得很多。这篇文章会教你如何在麒麟操作系统上设置QEMU-KVM虚拟化环境&#…...
[ComfyUI] 最新控制模型EasyControl,吉卜力风格一键转绘
一、EasyControl介绍 玩ComfyUI的都知道Controlnet的重要性,可以根据约束来引导图片的生成,这也是ComfyUI商业化里面很重要的一环。 不过之前我们用的Controlnet都是基于Unet技术框架下的。 最近出的这个EasyControl有点不一样,是基于DiT&a…...
项目执行中的目标管理:从战略到落地的闭环实践
——如何让目标不“跑偏”、团队不“掉队”? 引言:为什么目标管理决定项目成败? 根据PMI研究,47%的项目失败源于目标模糊或频繁变更。在复杂多变的项目环境中,目标管理不仅是制定KPI,更是构建“方向感-执行…...
《计算机视觉度量:从特征描述到深度学习》—深度学习工业检测方案评估
谢谢各位粉丝的支持,过去了一年多才再次更新技术博客。原因是个人家庭和技术发展在这短短一年多,发生了很大变化。本人身为技术博主,也在不断的探索和研究新技术在工业检测领域的技术方案。 并在这期间已经完成了基础的工业检测大模型的设计…...
网页防篡改与盗链防护:实时监控与自动化修复实践
摘要:针对网页内容篡改与盗链问题,本文基于群联AI云防护系统,详解如何通过哈希校验、实时监控与CDN联动实现秒级修复,并提供Python与AWS S3集成代码。 一、网页安全的核心需求 防篡改:保障页面内容完整性,…...
LR(0)
LR0就是当我处在自动机为红色这些结束状态的时候,这些红色状态就代表我们识别到了一个句柄,那现在的问题就是识别到了句柄,那要不要对他进行归约?LR0就是我不管当前指针指向的终结符是什么,我都拿它做规约 这里的二号状…...
鸿蒙开发-页面跳转
1.路由使用 //1.引入路由 import router from ohos.router//2.使用跳转router.pushUrl({url: "pages/Show"})2.页面跳转 import { router } from kit.ArkUI;Entry Component struct LoginPage {State message: string 登陆页;build() {Row() {Column() {Text(this…...
#MES系统中的一些相关的名词
📌MES系统 部分 术语表 缩写英文全称中文名称详细解释MESManufacturing Execution System制造执行系统用于连接计划系统与生产现场,实时管理和控制整个生产过程,覆盖物料、人员、设备、质量、指令等。ERPEnterprise Resource Planning企业资…...
无人船 | 图解基于视线引导(LOS)的无人艇制导算法
目录 1 视线引导法介绍2 LOS制导原理推导3 Lyapunov稳定性分析4 LOS制导效果 1 视线引导法介绍 视线引导法(Line of Sight, LOS)作为无人水面艇(USV)自主导航领域的核心技术,通过几何制导与动态控制深度融合的机制&am…...
LeetCode LCR157 套餐内商品的排列顺序
生成字符串的全部排列(去重):从问题到解决方案的完整解析 问题背景 在编程和算法设计中,生成字符串的所有排列是一个经典问题。它不仅出现在算法竞赛中,也在实际开发中有着广泛的应用,比如生成所有可能的…...
3.2.2.3 Spring Boot配置拦截器
在Spring Boot应用中配置拦截器(Interceptor)可以对请求进行预处理和后处理,实现如权限检查、日志记录等功能。通过实现HandlerInterceptor接口并注册到Spring容器,拦截器可以自动应用到匹配的请求路径。案例中,创建了…...
cryptozombies合约6
我们就快完成我们的随机僵尸制造器了,来写一个公共的函数把所有的部件连接起来。 写一个公共函数,它有一个参数,用来接收僵尸的名字,之后用它生成僵尸的DNA。 实战演习 创建一个 public 函数,命名为 createRandomZom…...
大模型文生图
提示词分4个部分:质量,主体,元素,风格 质量:杰作,高质量,超细节,完美的精度,高分辨率,大师级的; 权重:把图片加括号,&am…...
.NET MCP 示例
服务器端示例 基础服务器 以下是一个基础的 MCP 服务器示例,它使用标准输入输出(stdio)作为传输方式,并实现了一个简单的回显工具: using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.H…...
daz dForce to UE 的原理分析
dForce是物理模拟,不是关键帧动画: dForce是一个物理引擎。当你运行模拟时,Daz Studio会根据你设置的物理属性(如裙子的重量、布料的硬度、摩擦力)、环境因素(如重力、风力)以及与角色的碰撞&am…...
LeetCode 118题解 | 杨辉三角
题目链接: https://leetcode.cn/problems/pascals-triangle/description/ 题目如下: 解题过程如下: 杨辉三角就是一个不规则的二维数组,实际上是一个直角三角形。如图所示: 杨辉三角特点:每一行的第一个和最后一个都是…...
『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解
『Kubernetes(K8S) 入门进阶实战』实战入门 - Pod 详解 Pod 结构 每个 Pod 中都可以包含一个或者多个容器,这些容器可以分为两类 用户程序所在的容器,数量可多可少Pause 容器,这是每个 Pod 都会有的一个根容器,它的作用有两个 可…...
裂缝检测数据集,支持yolo,coco json,pasical voc xml,darknet格式的标注,1673张原始训练集图片,正确识别率99.4%
数据集详情: 裂缝检测数据集,支持yolo,coco json,pasical voc xml,darknet格式的标注,1673张原始训练集图片,正确识别率99.4% 2394总图像 数据集分割 训练集占比 70% 1673图片 有效集20% 477图片 测试集...
数据库索引深度解析:原理、类型与高效使用实践
🧠 一句话理解索引是什么? 索引就是数据库中的“目录”或“书签”,它能帮助我们快速找到数据的位置,而不是一页页地翻整本书。 🧩 一、为什么需要索引?(用生活化例子秒懂) 想象你在…...
