题目描述
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
题目解析
- 转变hours数组将符合劳累置为1, 不符合置为0
- 再次更新数组转变为前缀和。
- 求A[j] - A[i] > 0的最大距离,使用单调栈进行求和(单调递减)。
C++代码
int longestWPI(vector<int>& hours) {
vector<int> nh;
nh.push_back(0);
for(int i = 0; i < hours.size();i++) {
if(hours[i] >= 9)
nh.push_back(1);
else
nh.push_back(-1);
}
int sum = 0;
stack<int> st;
st.push(0);
for(int i = 1; i < nh.size();i++) {
sum += nh[i];
nh[i] = sum;
if(sum < nh[st.top()]) {
st.push(i);
}
}
int ans = 0;
for(int i = nh.size()-1; i>=0; i--) {
while(st.size() > 0 && nh[i] - nh[st.top()] > 0) {
ans = max(ans, i - st.top());
st.pop();
}
}
return ans;
}