LeetCode】每日一题(4)

简介: LeetCode】每日一题(4)

题目: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;
    }
};


过啦!!!


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果喜欢本文的话,欢迎点赞和评论,写下你的见解。


如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。


之后我还会输出更多高质量内容,欢迎收看。


相关文章
|
7月前
|
索引
leetcode每日一题刷题打卡1700
leetcode每日一题刷题打卡1700
53 0
|
2月前
【LeetCode-每日一题】移动零
【LeetCode-每日一题】移动零
29 1
|
6月前
|
算法
力扣每日一题 6/6
力扣每日一题 6/6
43 3
|
6月前
力扣每日一题 6/2
力扣每日一题 6/2
41 3
|
6月前
|
机器学习/深度学习
力扣每日一题 5/31
力扣每日一题 5/31
31 2
|
6月前
|
算法
力扣每日一题 6/10
力扣每日一题 6/10
56 1
【LeetCode】每日一题(3)
【LeetCode】每日一题(3)
67 0
|
算法 C语言 索引
每日一题:LeetCode-283. 移动零
每日一题:LeetCode-283. 移动零
【LeetCode】每日一题(2)
【LeetCode】每日一题(2)
68 0
【LeetCode】每日一题(5)
【LeetCode】每日一题(5)
56 0