这道题需要用到前缀和算法,来计算一个区间的元素和。我们把超过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;
}
};