表现良好的最长时间段
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
解题代码
思路:将原问题转换,假如是大于 8 的,变为 + 1,小于的变为 -1,再转换为前缀和,然后求解当前位置的数字找到前一个比它小的数字位置,当前区间就是一段大于等于0的区间,最长区间只需要依次遍历找到最大值即可
- [9,9,6,0,6,6,9]
- [1,1,-1,-1,-1,-1,1]
- [0,1,2,1,0-1,-2,-1] 前缀和序列起点需要增加一个0
var longestWPI = function(hours) {
let stack = []; // +1 -1序列
let sum = [0]; // 前缀和序列,且额外增加一个0
hours.forEach(v => stack.push(v > 8 ? 1 : -1)); // 转换为 +1 -1
stack.forEach(v => sum.push(v + sum[sum.length - 1])); // 转换为前缀和
let max = 0;
for (let i = sum.length - 1; i >= 0; i--) {
const num = sum[i];
for (let j = i - 1; j >= 0 ; j--) { // 遍历从位置 n 到 位置0 - n 这个区间中,比下标n小于的值,取最长即可
const element = sum[j];
if (element < num ) {
max = Math.max(max,i - j);
} else continue;
}
}
return max;
};