力扣 — — 2555. 两个线段获得的最多奖品

news2025/4/21 9:51:44

力扣 — — 2555. 两个线段获得的最多奖品

一、题目描述

请添加图片描述

题目大意:给定一个数组prizePositions,数组中的值表示的是奖品的位置,每一个位置可以有多个奖品,并且设定一个线段的长度 K K K,要求从所有奖品位置中选择两个长度为 K K K 的连续位置线段,并且要求这两个线段中的奖品位置上的奖品数量之和是最大的。(假设:数组prizePositions是一个非递减的序列)

二、问题分析

通过分析问题,由贪心的思想可以想到,不重叠的两个线段一定会比重叠的两个线段包含的奖品数量多,由此可以使用滑动窗口和动态规划算法进行求解,具体求解为如下:

  1. 将数组分割为两个部分,从前往后遍历每一个分割的位置。
  2. 对于每一个位置,都可以将原数组分割为两个部分,由此,我们可以求得前一个部分的最大值和后一个位置的最大值,将这两个位置的最大值进行相加即可得到最后的一个整体的大值。
  3. 对于上述方法,我们可以使用动态规划的方法进行求解,分为从前向后遍历以及从后向前遍历,在每一次遍历的过程中,求每一个位置滑动窗口的最大值,这里可以使用两个数组分别进行记录。
  4. 最后遍历每一个分割的位置(即:利用两个动态数组进行求解),将前一个部分的最大值与后一个位置的最大值进行相加,寻求一个全局的最大值,该最大值即为最终要求的最大值。

三、代码实现

详细代码

    int myUnite(vector<int>& prizePositions, int k){
        int n = prizePositions.size();
        // 设定两个数组,分别存储从前向后遍历的动态最大值和从后向前的动态最大值。
        vector<int> perArray(n + 1), backArray(n + 1);
        // 将数组分割为两个部分, 求前一个部分
        for(int i  = 0, j = 0; j < n; j ++){
            // 用于控制窗口的大小,避免窗口大于给定的值。
            while((prizePositions[j] - prizePositions[i]) > k) {
                i ++;
            }
            // 对于每一个位置,都进行动态决策
            perArray[j + 1] = max(perArray[j], j - i + 1);
        }
        // 先对数组进行反转
        reverse(prizePositions.begin(), prizePositions.end());
        // 将数组分割为两个部分,求后一个部分
        for(int i = 0, j = 0; j < n; j ++){
            // 控制窗口大小, 进行反转之后,后一个值小于前一个值,所以使用前一个值减去后一个值。
            while((prizePositions[i] - prizePositions[j]) > k){
                i ++;
            }
            // 对每一个位置进行决策
            backArray[j + 1] = max(backArray[j], j - i + 1);
        }

        // 遍历每一个分割位置,求得全局的最优值
        int ans = 0;
        for(int i = 0; i <= n;i ++){
            ans = max(ans, perArray[i] + backArray[n - i]);
        }
        return ans;
    }

简化之后的代码:

class Solution {
public:
    int maximizeWin(vector<int>& prizePositions, int k){
        int n = prizePositions.size();
        // 使用匿名函数
        auto calc = [&] (vector<int>& prefix, int reverseFlag){
            // 遍历每一个位置寻找固定内的窗口的最大值
            for(int i = 0, j = 0; j < n; j++){
                // 控制窗口大小
                while(reverseFlag * (prizePositions[j] - prizePositions[i]) > k) {
                    i++;
                }
                // 通过动态规划的思想,求当到当前位置为止,累计求得的最大值。
                prefix[j + 1] = max(prefix[j], j - i + 1);
            }
        };
        // 分别从前向后动态求值,在从后向前动态求值。
        vector<int> prefix(n + 1), backfix(n + 1);
        calc(prefix, 1);
        reverse(prizePositions.begin(), prizePositions.end());
        calc(backfix, -1);
        int ans = 0;
        for(int i = 0; i <= n;i ++){
            ans = max(ans, prefix[i] + backfix[n - i]);
        }
        return ans;
    }
};

请添加图片描述

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

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

相关文章

修改Netty 中EventLoopGroup的线程名字前缀

此方案针对 netty 4 , 阅读Netty 源码的过程中涉及到多种线程跳转&#xff0c;2-1 3-1 4-1 类似的命名头晕眼花&#xff0c;直接改了成方便辨认的名字吧&#xff01; 代码如下&#xff1a; public static EventLoopGroup getEventLoopGroup(String name, int nThread) {Defaul…

第十一周:机器学习

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…

SVGJS使用

svgjs用于操作 SVG 和动画的轻量级库。 官网 SVG.js v3.2 |家 (svgjs.dev) 1、安装 npm install svgdotjs/svg.js 或者下载直接引用 2、使用 <script src"https://cdn.jsdelivr.net/npm/svgdotjs/svg.js3.0/dist/svg.min.js"></script> import { S…

Win11 22H2/23H2用户速来!9月更新补丁KB5043076已发布

系统之家于9月11日发出最新报道&#xff0c;微软针对Win11用户发布了9月最新的更新补丁KB5043076&#xff0c;22H2用户升级系统后&#xff0c;版本号升至22621.4169&#xff0c;23H2用户的系统版本也升至22631.4169。此次更新支持用户从Windows分享窗口将内容共享到安卓设备。以…

95. UE5 GAS RPG 实现创建多段飞弹攻击敌人

从这篇开始&#xff0c;我们将实现一些技能&#xff0c;比如多段火球术&#xff0c;闪电链等等。 在这一篇里&#xff0c;我们先实现多段火球术&#xff0c;技能可以通过配置发射出多个火球术进行攻击。 创建多段火球函数 首先在我们之前创建的RPGFireBolt.h类里面增加一个生…

k8s的环境配置

一、前期系统环境准备 准备3台主机&#xff1a;硬盘50G cpu2个 内存2G 1、3台主机同时配置 1&#xff09;关闭防火墙与selinux、NetworkManager [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/…

ctfshow-web入门-sql注入-web248-UDF 注入

udf 全称为&#xff1a;user defined function&#xff0c;意为用户自定义函数&#xff1b;用户可以添加自定义的新函数到 Mysql 中&#xff0c;以达到功能的扩充&#xff0c;调用方式与一般系统自带的函数相同&#xff0c;例如 contact()&#xff0c;user()&#xff0c;versio…

VUE实现刻度尺进度条

一、如下图所示效果: 运行后入下图所示效果: 实现原理是用div画图并动态改变进度, 二、div源码 <div style="width: 100%;"><div class="sdg_title" style="height: 35px;"><!--对话组[{{ dialogGroup.index }}]编辑-->&…

如何在微信中使用AI智能回复,真AI大模型;微加机器人免费智能回复功能

之前一直想实现在微信中使用AI大模型进行消息回复&#xff0c;也使用过很多开源的工具自己调OpenAI的API&#xff0c;但是整体太复杂&#xff0c;而且跑在自己电脑上也不稳定 今天发现微加机器人也支持AI回复&#xff0c;而且AI功能还是免费的&#xff0c;没有tokens收费 微加…

【Gephi】可视化教程

此教程专供欣欣向荣及其舍友使用 文章目录 导入数据上色改变布局设置节点大小统计拓扑结构输出图形保存文件 导入数据 点击【文件】-【导入电子表格】 先选择csv格式的network 直接下一步 点击完成 【图的类型】改为“有向的” 点击确认 会弹出报错&#xff0c;直接clos…

CSS 响应式设计(补充)——WEB开发系列36

随着移动设备的普及&#xff0c;网页设计的焦点逐渐转向了响应式设计。响应式设计不仅要求网页在各种屏幕尺寸上良好展示&#xff0c;还要适应不同设备的特性。 一、响应式设计之前的灵活布局 在响应式设计流行之前&#xff0c;网页布局通常是固定的或流动的。固定布局使用固定…

vc-upload源码分析 -- ant-design-vue系列

vc-upload源码分析 – ant-design-vue系列 1 整体结构 上传组件的使用分两种&#xff1a;点击上传和拖拽上传。 点击的是组件或者是卡片&#xff0c;这个是用户通过插槽传递的。除上传外的其他功能&#xff0c;比如预览、自定义文件渲染等功能&#xff0c;也不是上传的核心功…

2. 变量和指令(omron 机器自动化控制器)——1

机器自动化控制器——第二章 变量和指令 1 2-1 变量一览表MC通用变量轴变量▶ 轴组变量 运动控制指令的输入变量输入变量的有效范围▶ 枚举体一览表 运动控制指令的输出变量运动控制指令的输入输出变量 2-1 变量一览表 MC功能模块使用的变量分为两类。 一类是监视轴等的状态及…

【SQL】百题计划:SQL对于空值的比较判断。

[SQL]百题计划 方法&#xff1a; 使用 <> (!) 和 IS NULL [Accepted] 想法 有的人也许会非常直观地想到如下解法。 SELECT name FROM customer WHERE referee_Id <> 2;然而&#xff0c;这个查询只会返回一个结果&#xff1a;Zach&#xff0c;尽管事实上有 4 个…

关于使用HAWQ量化框架执行训练前推理的性能崩溃问题

问题描述 今天debug量化模型遇到一个比较奇怪的问题&#xff0c;之前从来没有注意过&#xff1a; 现在量化模型的流程是&#xff1a; 1&#xff09;加载预训练好的浮点数权重模型&#xff1b; 2&#xff09;将模型架构替换成量化架构&#xff08;逐模块替换&#xff09;&#…

Linux和C语言(Day11)

一、学习内容 讲解有参函数 形参 和 实参 形参——定义时的参数&#xff0c;形式上的参数&#xff0c;没有实际意义&#xff0c;语法上必须带有数据类型 void fun(int a,int b); void fun(int a[],int n); void fun(char *s); 可以是&#xff1a;变量、数组、指针 实参——调用…

【笔记】物理化学绪论

文章目录 1. 物理化学的目的和研究内容什么是物理化学&#xff1f;目的内容 2. 物理化学的学习方法3. 物理量的表示和运算&#xff08;1&#xff09;物理量的表示&#xff08;2&#xff09;量值计算 4. 课程安排 1. 物理化学的目的和研究内容 用物理变化 P、V、T热效应电效应…

【数据结构】排序算法系列——序言(附源码+图解)

作为基础算法的中流砥柱部分&#xff0c;排序算法一直都是计算机学习者们不可忽略的一部分。而其中的算法思想也蕴含着许多在今后的算法学习甚至是整个计算机技术的学习之中仍然熠熠生辉的算法思想&#xff0c;它们引领着我们不断探索算法的奥秘之处。所以&#xff0c;学习排序…

黑神话悟空大圣残躯怎么打 头目大圣残躯攻略

​面对《黑神话&#xff1a;悟空》中的终极挑战——大圣残躯&#xff0c;掌握其打法要点&#xff0c;是通往胜利的关键。下面&#xff0c;就让我们一步步解析如何战胜这位强大的最终BOSS吧。 一、BOSS位置 随主线流程必解锁。击败石猿后&#xff0c;齐天大圣的真身——大圣残躯…

IIC通信中设备的交互流程

本文主要叙述&#xff0c;当两个设备进行 IIC 通信时&#xff0c;两个设备的交互流程&#xff0c;即主机的动作和从机的动作。当通过软件编程的方式实现设备间的 IIC 通信时&#xff0c;我们就是按照主机的动作或从机的动作来编写对应的代码。实际上&#xff0c;主机和从机是按…