LeetCode 1124.表现良好的最长时间段(c++)

74 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

1234.替换子串得到平衡字符串

给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。

我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。

所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。

请你返回「表现良好时间段」的最大长度。

示例 1 :

输入: hours = [9,9,6,0,6,6,9]
输出: 3
解释: 最长的表现良好时间段是 [9,9,6]

示例 2:

输入: hours = [6,6,6]
输出: 0

提示:

  • 1 <= hours.length <= 104
  • 0 <= 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;
    }
};

四、总结

先开始我还以为是和昨天的题目一样,通过双指针来解题的。结果后面才发现原来是自己大意了。好难啊