LeetCode 1124 表现良好的最⻓时间段

125 阅读1分钟

参加了 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 <= 104
  • 0 <= 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;
};