解题思路
将原问题转换,假如是大于 8 的,变为 + 1,小于的变为 -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;
};