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

力扣1124:表现良好的最长时间段

力扣1124:表现良好的最长时间段

  • 题目
  • 思路
  • 代码

题目

给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。

我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。

所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。

请你返回「表现良好时间段」的最大长度。

思路

想要找到最大长度所以我们要么确定左边界然后寻找符合条件的最右边界,要么就是确定右边界然后寻找符合条件的最左边界。
那么其他的先不谈,怎么才算符合条件。想要劳累的天数严格大于不劳累的天数也就是要满足劳累的天数大于整个天数的二分之一那么我们是否可以把劳累的天数当作1不劳累的天数当作-1同时创建一个整数数组来存储当前位置是否是表现良好的时间段里的一部分也就是说当前位置需要存储前面天中劳累天数是否大于不劳累天数,简单来说就是生成一个前缀和数组。
在有了前缀和数组后我们再来思考在前缀和数组中左边界和右边界有什么关系以及左边界右边界有什么特征,首先右边界的值一定大于左边界不然没法满足劳累的天数严格大于不劳累的天数这是因为在有了前缀和后子数组和元素和问题就转换为了两个前缀和的差值了。其次我们需要关注的左边界一定是一个单调递减的因为一旦左边界变大了之后它就当不了最左边界了,要知道右边界肯定是比左边界大的所以右边界肯定也就大于你前一个位置那你凭啥当最左边界。所以我们需要构建一个数据结构来存储那些不断减小的左边界的位置,我们可以使用栈来当这个数据结构这样也就形成了一个单调栈。每次插入栈我们只需要判断当前位置的值是否小于栈顶的值即可如果小于就插入位置,这样我们就形成了一个从栈底到栈顶单调递减的一个单调栈。在确定可以当最左边界的位置后我们就需要确定右边界的位置了,我们直接从后往前遍历。然后判断当前位置的值是否大于栈顶的值如果大于我们就更新最大长度直到小于栈顶元素,再进行前一个位置的判断。也就是说我们先把最后的位置当作右边界然后进行一轮一轮的判断来确定左边界同时更新最大长度。

代码

class Solution {
public:int longestWPI(vector<int>& hours) {// 栈stack<int> st;int res = 0;int n = hours.size();// 前缀和数组int nums[n + 1];st.push(nums[0] = 0);for (int j = 1; j <= n; j++) {nums[j] = nums[j - 1] + (hours[j-1] > 8 ? 1 : -1);if (nums[j] < nums[st.top()]) {// 从栈底到栈顶的一个单调递减的栈// 也就是有可能为时间段的最左点st.push(j);}}// 从后向前遍历,先确定最右点再确定最左点for (int i = n ; i > 0; i--) {while (!st.empty() && nums[i] > nums[st.top()]) {res = max(res, i - st.top());st.pop();}}return res;}
};
http://www.lryc.cn/news/609582.html

相关文章:

  • 【Java】使用FreeMarker来实现Word自定义导出
  • leetcode-sql-3497分析订阅转化
  • 旧物回收小程序:开启绿色生活新篇章
  • Array容器学习
  • LeetCode 132:分割回文串 II
  • 【YOLO系列】YOLOv12详解:模型结构、损失函数、训练方法及代码实现
  • 关于Npm和Nvm的用法
  • Linux 环境 libpq加载异常导致psql 连接 PostgreSQL 库失败失败案例
  • uniapp开发微信小程序textarea在ios下有默认内边距的问题(textarea兼容问题)
  • 如何给Word和WPS文档添加密码或取消密码
  • Ethereum:拥抱开源,OpenZeppelin 未来的两大基石 Relayers 与 Monitor
  • Jwts用于创建和验证 ​​JSON Web Token(JWT)​​ 的开源库详解
  • OpenLayers 入门指南【五】:Map 容器
  • R 语言科研绘图第 67 期 --- 箱线图-显著性
  • Nestjs框架: Node.js 多环境配置策略与 dotenv 与 config 库详解
  • 政府财政行业云原生转型之路
  • Druid学习笔记 01、快速了解Druid中SqlParser实现
  • 排序算法入门:直接插入排序详解
  • 室内分布系统
  • ICCV 2025|单视频生成动态4D场景!中科大微软突破4D生成瓶颈,动画效果炸裂来袭!
  • Flutter开发 了解Scaffold
  • 深入理解Java的SPI机制,使用auto-service库优化SPI
  • 区块链基础之Merkle B+树
  • Azure DevOps - 使用 Ansible 轻松配置 Azure DevOps 代理 - 第6部分
  • 打造个人数字图书馆:LeaNote+cpolar如何成为你的私有化知识中枢?
  • 多级表头的导出
  • 软件打包前进行文件去重
  • Unix 命令行shell基础--学习系列003
  • Web 开发 12
  • 嵌入式硬件中三极管原理分析与控制详解