题目:1124. 表现良好的最长时间段 - 力扣(Leetcode)
题目的接口:
class Solution { public: int longestWPI(vector &hours) { } };
解题思路:
这题好难,我之前没做过这样类似的题型,还是刷题刷少了,
这次全靠大神题解救我一命,但也有好多看不懂的操作。
废话不多说:
这题用的是前缀和以及单调栈的思路:
我们建一个vector计算前缀和:
思路是:如果工作小时大于8就看成1,工作小时小于8就看成-1。
然后维护一个递减的单调栈,每次将更远的区间位置push进去。
最后逆序迭代前缀和数组,与单调栈中的最远区间位置对比,
通过相减计算最远距离,最后返回即可。
代码:
class Solution { public: int longestWPI(vector &hours) { int n = hours.size(); //建一个vector用来存储前缀和 vector v(n + 1, 0); //建立并维护一个单调递减的栈 stack st; st.push(0); //遍历整个数组 for(int i = 1;i <= n;i++) { //计算前缀和 v[i] = (hours[i - 1] - 8 > 0 ? 1 : -1) + v[i - 1]; //当出现更远距离的时候push进去 if(v[st.top()] > v[i]) { st.push(i); } } int ans = 0; //倒序遍历前缀数组 for(int j = n;j >= 0;j--) { while(!st.empty() && v[j] > v[st.top()]) { //计算最大距离 ans = max(ans, j - st.top()); st.pop(); } } return ans; } };
过啦!!!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果喜欢本文的话,欢迎点赞和评论,写下你的见解。
如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。
之后我还会输出更多高质量内容,欢迎收看。