[路飞]_LeetCode题1124表现良好时间段

197 阅读1分钟

题目描述

给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。

我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。

所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。

请你返回「表现良好时间段」的最大长度。

 

示例 1:

输入:hours = [9,9,6,0,6,6,9] 输出:3 解释:最长的表现良好时间段是 [9,9,6]。 示例 2:

输入:hours = [6,6,6] 输出:0  

提示:

1 <= hours.length <= 10410^4 0 <= hours[i] <= 16

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

image.png

题解代码

 * @lc app=leetcode.cn id=1124 lang=javascript
 *
 * [1124] 表现良好的最长时间段
 */

// @lc code=start
/**
 * @param {number[]} hours
 * @return {number}
 */
var longestWPI = function(hours) {
  let max = 0;
  //用一个数组存放每天及之前的有效工作的天数和
  //1.有效:当前位置天数+1
  //2.无效:当前天数-1
  let preSum = new Array(hours.length + 1).fill(0);
  for (let i = 1; i <= hours.length; i++) {
    if (hours[i-1] > 8) preSum[i] = preSum[i - 1] + 1
    else preSum[i] = preSum[i - 1] - 1
  }
  //当两个位置i,j的有效天数差>0,说明在这个[i+1,j]的连续闭合区间内是表现良好时间段
  //[i+1,j]区间内的天数为j-i
  //依次比较所有是表现良好时间段,取其中最大的值j-i
  for (let i = 0; i < preSum.length; i++) {
    for (let j = i + 1; j < preSum.length; j++) {
      if(preSum[j] - preSum[i] > 0){
        max = Math.max(max,j-i);
      }      
    }
  }
  return max;
};
// @lc code=end