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;
    }
};


过啦!!!


写在最后:

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


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


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


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


相关文章
|
6月前
|
算法
刷题之Leetcode34题(超级详细)
刷题之Leetcode34题(超级详细)
50 0
|
6月前
leetcode15刷题打卡
leetcode15刷题打卡
455 0
|
6月前
|
算法
leetcode454刷题打卡
leetcode454刷题打卡
39 0
|
6月前
刷题之Leetcode54题(超级详细)
刷题之Leetcode54题(超级详细)
30 0
|
6月前
|
Java
刷题之Leetcode19题(超级详细)
刷题之Leetcode19题(超级详细)
38 0
|
6月前
leetcode344刷题打卡
leetcode344刷题打卡
26 0
|
6月前
leetcode203刷题打卡
leetcode203刷题打卡
466 0
|
6月前
|
索引
leetcode151刷题打卡
leetcode151刷题打卡
32 0
|
6月前
leetcode225刷题打卡
leetcode225刷题打卡
39 0
|
6月前
|
测试技术 索引
leetcode707刷题打卡
leetcode707刷题打卡
30 0