# Longest Well-Performing Interval

We are given `hours`, a list of the number of hours worked per day for a given employee. A day is considered to be a _tiring day_ if and only if the number of hours worked is (strictly) greater than `8`.

A _well-performing interval_ is an interval of days for which the number of tiring days is strictly larger than the number of non-tiring days.

Return the length of the longest well-performing interval.

**Example 1:**

```
Input: hours = [9,9,6,0,6,6,9]
Output: 3
Explanation: The longest well-performing interval is [9,9,6].
```

### Thoughts



一串数字，找其中满足值大于8元素个数大于不满足的个数的最长子数组。

1. 元素分成两种，并且要比较两种的个数，想到可以+1-1且当子数组sum>0时说明该子数组为满足条件的数组。
2. 答案分成两类，整个数组即答案，此时sum(v\[0:N]) > 0; 或者是子数组\[i:j]，此时一定满足sum\[v\[i:j]] == 1， 因为如果>1，说明该子数组还可以扩张来包含-1的元素，不会是最优解。
3. 找满足sum(v\[i:j]) == k的最长子数组，转化成max subarray equals k 问题，用persum求解(hashmap)。

```
class Solution {
public:
    int longestWPI(vector<int>& hours) {
        int sum = 0, N = hours.size(), res = 0;
        unordered_map<int, int> pre_sums;
        for (int i = 0; i < N; ++i) {
            sum += hours[i] > 8 ? 1 : -1;
            if (sum > 0) res = i + 1;
            else {
                if (pre_sums.find(sum - 1) != pre_sums.end()) res = max(res, i - pre_sums[sum - 1]);
                if (pre_sums.find(sum) == pre_sums.end()) pre_sums[sum] = i;
            }
        }
        return res;
    }
};
```
