参加了 kkb 的门徒培训,想要记录下自己的成长过程。每天一篇,坚持不断更 --- 2022.3.26
题目描述
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
示例 1:
输入: hours = [9,9,6,0,6,6,9]
输出: 3
解释: 最长的表现良好时间段是 [9,9,6]。
示例 2:
输入: hours = [6,6,6]
输出: 0
提示:
1 <= hours.length <= 1040 <= hours[i] <= 16
解题思路
「表现良好时间段」可以认为是一段符合要求的时间相叠加。
这里可以使用前缀和,前缀和是通过空间换时间的方式,将所需数组元素和进行储存。当我们计算某一段的时间时,我们只需要 O(0) 的时间复杂度就可以。
操作前缀和,一定程度上也是对原数组进行了相关操作。
/**
*
* @param {number} a
* @param {number} b
* @returns {number}
*/
const max = (a, b) => {
return a > b ? a : b;
}
/**
* @param {number[]} hours
* @return {number}
*/
var longestWPI = function(hours) {
const pre = [];
pre.push(0);
for (let i = 0; i < hours.length; i++) {
let j = hours[i] > 8 ? 1 : -1;
pre.push(pre[i] + j);
}
const preObj = {};
let ans = 0;
for (let i = 0; i < pre.length; i++) {
// 最早出现 pre[i] 的位置 i
if (!preObj[pre[i]]) preObj[pre[i]] = i;
if (preObj[pre[i] - 1]) {
ans = max(ans, i - preObj[pre[i] - 1]);
}
if (pre[i] > 0) ans = max(ans, i)
}
return ans;
};