leetcode 1124. 表现良好的最长时间段

embedded/2025/2/5 6:01:48/

题目如下
在这里插入图片描述
数据范围
在这里插入图片描述

这题的代码好些但是思路十分复杂如果代码再难一点估计就是困难题了,我愿称为中等的困难题。
本题可以用另一个角度来思考,令超8小时为1否则为-1令pre[i]为i天之前的和即pre是前缀和数组。那么当i小于等于j时有pre[j] - pre[i]大于0 i j这段时间即为良好时间段。所以我们只要在此基础之上找到j - i的最大值即可。
现在假设我们正在遍历数组的第j个元素我们的目标就是找到合适的i那么我们便需要一个数据结构来存储从0开始的递减数列,显然只有单调栈能做到这个要求。那么这里有必要思考一下为什么是从0开始的序列而非任意一个位置开始的序列了:
我们先假设数组存在两个递减序列,同时我们固定j因为我们目标是找j对应的i,
令in(x)为x对应的数组下标
两个序列分别是An,Bm 那么我们令An从0开始即A1 = 0;(注意 An序列是第一个生成的其序列必然包含最小值,对于像Bm这样的序列不能与An有重复)
设in(B1) > in(A1)显然B1 >= A1 (因为B1 小于A1那么B1应该在A序列中与假设矛盾)
那么现在我们假设j对应的pre值大于A1 B1显然由于in(B1) > in(A1) 所以A1才是最优解。
我们可以把情况往普遍方向推 反证法:
假设存在i是j的最优解且i是B序列的即有(0 <= k < i)的数均大于Bi(不能等于哦因为是最优解一旦等于就会有更长的区间)诶这与我们之前假设的矛盾因为从0到i i对应的前缀pre[i]是这个小区间的最小值且不在A序列中,但是这不是巧了吗A序列必然包含这个小区间的最小值(很显然)所以矛盾 故最优解必然存在于A序列之中。
tips:在遍历j时从后往前 因为这样可以避免重复计算。证明就借用leetcode官方的过程这里不是本题的难点。

在这里插入图片描述

这里的r指的就是刚才的j。

通过代码

class Solution {
public:int longestWPI(vector<int>& hours) {int n = hours.size();vector<int> pre(n + 1);stack<int> stack;int ans = 0;stack.push(0);for (int i = 1; i <= n; i++) {pre[i] = pre[i - 1] + (hours[i - 1] > 8? 1 : -1);if (pre[stack.top()] > pre[i]) {stack.push(i);}}for (int i = n; i > 0; i--) {while (stack.size()&&pre[stack.top()] < pre[i]) {ans = max(ans, i - stack.top());stack.pop();}}return ans;}
};

在这里插入图片描述


http://www.ppmy.cn/embedded/159671.html

相关文章

HarmonyOS:ArkWeb进程

ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…

Linux远程登陆

文章目录 ssh命令远程登陆Xshell远程登陆 ssh命令远程登陆 打开cmd&#xff0c;通过ssh命令进行远程登陆 Xshell远程登陆 1.下载Xshell与XFTP 下载链接 打开Xshell&#xff0c;新建会话 进行一些设置&#xff1a; 同样安装XFTP进行文件的传输&#xff1a;

使用mockttp库模拟HTTP服务器和客户端进行单元测试

简介 mockttp 是一个用于在 Node.js 中模拟 HTTP 服务器和客户端的库。它可以帮助我们进行单元测试和集成测试&#xff0c;而不需要实际发送 HTTP 请求。 安装 npm install mockttp types/mockttp模拟http服务测试 首先导入并创建一个本地服务器实例 import { getLocal } …

【Vite + Vue + Ts 项目三个 tsconfig 文件】

Vite Vue Ts 项目三个 tsconfig 文件 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件&#xff1f;首先我们先了解什么是 tsconfig.json ? 为什么 Vite Vue Ts 项目会有三个 tsconfig 文件&#xff1f; 在使用 Vite 创建 vue-ts 模板的项目时&#xff0c;会发现除了 ts…

【Super Tilemap Editor使用详解】(十五):从 TMX 文件导入地图(Importing from TMX files)

Super Tilemap Editor 支持从 TMX 文件(Tiled Map Editor 的文件格式)导入图块地图。通过导入 TMX 文件,你可以将 Tiled 中设计的地图快速转换为 Unity 中的图块地图,并自动创建图块地图组(Tilemap Group)。以下是详细的导入步骤和准备工作。 一、导入前的准备工作 在导…

医疗方向的可视化大屏,十分契合医疗行业数据量大的特点

在当今数字化医疗快速发展的时代&#xff0c;医疗行业积累的数据量呈爆炸式增长。从患者的个人基本信息、过往病史、各项检查检验报告&#xff0c;到医疗机构日常运营产生的物资管理数据、设备运行数据&#xff0c;再到大规模医疗研究中的海量样本数据&#xff0c;这些数据的规…

神经网络常见激活函数-sigmoid函数

sigmoid 1 函数求导 sigmoid函数 σ ( x ) 1 1 e ( − x ) \sigma(x) \frac{1}{1e^{(-x)}} σ(x)1e(−x)1​ sigmoid函数求导 d d x σ ( x ) d d x ( 1 1 e − x ) e − x ( 1 e − x ) 2 ( 1 e − x ) − 1 ( 1 e − x ) 2 1 1 e − x − 1 ( 1 e − x ) 2 …

wordpress安装

安装WordPress安装包&#xff0c;解压缩&#xff0c;安装到指定位置安装php环境&#xff1a; 下载&#xff1a;sudo yum install php php-fpm php-mysqlnd安装&#xff1a;sudo systemctl start php-fpmsudo systemctl enable php-fpm检测&#xff1a;php -v查询状态&#xff1…