「这是我参与12月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
1124. 表现良好的最长时间段
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。
示例1 :
输入: hours = [9,9,6,0,6,6,9]
输出: 3
解释: 最长的表现良好时间段是 [9,9,6]。
提示:
1 <= hours.length <= 100000 <= 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;
};