力扣刷题:29-表现良好的最长时间段(1124)

160 阅读1分钟

这道题需要用到前缀和算法,来计算一个区间的元素和。我们把超过8小时的节点称为1,小于等于8小时的节点为-1,这样,我们就是要找出连续的一段区间和的值大于0的最长的区间数量。由于节点值只有1和-1,所以,区间和有一定的规律,就是没增加一个节点,要么加1,要么减1,利用这个规律,我们就可以实现我们的算法了。

下面是用C++语言实现的代码。

class Solution {
public:
    int longestWPI(vector<int>& hours) {
        int ret = 0;
        unordered_map<int, int> ind;
        unordered_map<int, int> f;
        ind[0] = -1;
        f[0] = 0;
        int cnt = 0;
        for (int i = 0; i < hours.size(); i++) {
            if (hours[i] > 8) {
                cnt ++;
            } else {
                cnt --;
            }
            if (ind.find(cnt) == ind.end()) {
                ind[cnt] = i;
                if (ind.find(cnt - 1) == ind.end()) {
                    f[cnt] = 0;
                } else {
                    f[cnt] = f[cnt - 1] + (i - ind[cnt - 1]);
                }
            }
            if (ind.find(cnt - 1) == ind.end()) {
                continue;
            }
            ret = max(ret, f[cnt - 1] + (i - ind[cnt - 1]));
        }
        return ret;
    }
};