开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
示例 1 :
输入: hours = [9,9,6,0,6,6,9]
输出: 3
解释: 最长的表现良好时间段是 [9,9,6]。
示例 2:
输入: hours = [6,6,6]
输出: 0
提示:
1 <= hours.length <= 1040 <= hours[i] <= 16
二、思路分析
首先这题我们要先把hours中大于8的数替换为1,小于8的数替换为-1,然后创建一个记录hours前缀和的数组,将每一个位置的前缀和计算出来。并创建一个栈,先从头开始遍历前缀和数组,遇见比栈顶小的数就放入栈中。
最后从末尾遍历数组,并不断更新结果,得到最终的结果。
三、AC代码
class Solution {
public:
int longestWPI(vector<int> &hours) {
int n = hours.size(), ans = 0, s[n + 1]; // 前缀和
stack<int> st;
st.push(s[0] = 0);
for (int j = 1; j <= n; ++j) {
s[j] = s[j - 1] + (hours[j - 1] > 8 ? 1 : -1);
if (s[j] < s[st.top()]) st.push(j); // 感兴趣的 j
}
for (int i = n; i; --i)
while (!st.empty() && s[i] > s[st.top()]) {
ans = max(ans, i - st.top()); // [栈顶,i) 可能是最长子数组
st.pop();
}
return ans;
}
};
四、总结
先开始我还以为是和昨天的题目一样,通过双指针来解题的。结果后面才发现原来是自己大意了。好难啊