[路飞]_程序员必刷力扣题: 1124. 表现良好的最长时间段

183 阅读1分钟

「这是我参与12月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

1124. 表现良好的最长时间段

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

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

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

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

示例1 :

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

提示:

  • 1 <= hours.length <= 10000
  • 0 <= hours[i] <= 16

暴力破解

思路

因为最大长度可能从任意一天开始算起,所以我们需要计算从每天开始的可能性

  • 每天都是紧挨的,不能跳跃,只能挨个遍历
  • 最长的结果可能从任何一天开始计算,所以需要第一层遍历,第二层遍历直接从第i天开始,因为天数只能往后,不可能往前
  • 用long来记录劳累的天数,当hours大于8小时时,就是劳累的一天,我们让long加1。
  • 用less来记录不劳累的天数,当hours小于8小时时,就是不劳累的一天,我们让less减1。
  • 如果满足long>less 则表示满足条件,而long和less本来就表示天数,所以此时的总天数total就是long+less和max,最后用max来记录最大天数(每次用total和max进行比较取最大值)

最后返回最大值即可

复杂度分析

这里我们用的是双循环暴力破解,时间复杂度为O(n2),是非常慢的一种算法 这里我们没有占用额外空间,所以空间复杂度为O(1)

var longestWPI = function (hours) {
    var max = 0
    for (let i = 0; i < hours.length; i++) {
        var long = 0
        var less = 0
        for (let j = i; j < hours.length; j++) {
            const item = hours[j];
            if (item > 8) {
                long++
            } else {
                less++
            }
            if (long > less) {
                max = Math.max(max, long + less);
            }
        }
    }
    return max;
};