给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。
我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。
所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。
请你返回「表现良好时间段」的最大长度。 示例 1:
输入:hours = [9,9,6,0,6,6,9] 输出:3 解释:最长的表现良好时间段是 [9,9,6]。
提示:
1 <= hours.length <= 10000 0 <= hours[i] <= 16
1.创建个新的数组arr,每个元素与hours的元素对应,arr[i]=1 if hours[i]>8 else -1 2.符合良好表现时间段:某段区间的arr的和>0 求某段区间的和:求arr的前缀和,储存在presum数组中,presum[j]-presum[i]即arr[i]到arr[j]的和 3.若presum[j]-presum[i]>0,则j-i符合表现良好的时间段,因此只需要符合presum[j]-presum[i]的最长的j-i 4.考虑i:若i1>i , presum[i1]>presum[i],则i1一定不可能是答案,因此我们找presum中的一个递减子序列,最终答案的i一定在这个递减子序列中 5.考虑j:从后往前遍历数组presum,若满足presum[j]-presum[i]>0,则j不用往前走了
class Solution: def longestWPI(self, hours: List[int]) -> int: arr=[] for val in hours: if val>8: arr.append(1) else: arr.append(-1) prefixSum=[] cur_sum=0 for val in arr: prefixSum.append(cur_sum) cur_sum+=val prefixSum.append(cur_sum) stk=[] for i in range(len(prefixSum)): if len(stk)==0 or prefixSum[stk[-1]]>prefixSum[i]: stk.append(i) res=0 for j in range(len(prefixSum)-1,-1,-1): while len(stk)!=0 and prefixSum[j] >prefixSum[stk[-1]]: res=max(res,j-stk[-1]) stk.pop() return res