給你乙份工作時間表 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:
1)else:-
1)prefixsum=
cur_sum=
0for val in arr:
cur_sum+=val
stk=
for i in
range
(len
(prefixsum)):
iflen
(stk)==0
or prefixsum[stk[-1
]]>prefixsum[i]
: res=
0for 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
1124 表現良好的最長時間段
題意 給你乙份工作時間表 hours,上面記錄著某一位員工每天的工作小時數。我們認為當員工一天中的工作小時數大於 8 小時的時候,那麼這一天就是 勞累的一天 所謂 表現良好的時間段 意味在這段時間內,勞累的天數 是嚴格 大於 不勞累的天數 請你返回 表現良好時間段 的最大長度。示例 1 輸入 hou...
1124 表現良好的最長時間段 字首和 雜湊表
難度 中等 題目描述 解題思路 看到這種 要求連續區間而且滿足一定條件,最大 最小等等都可以考慮一下字首和法。字首和最大的醫用就是可以在o 1 時間內得到任意乙個區間 i,j 的和。在這道題裡,當工作時間大於8,設定成1,小於8等於 1,由此計算字首和 如果字首和大於0,說明從0開始的區間裡到當前位...
1124 表現良好的最長時段
同類題目 題目描述 給你乙份工作時間表 hours,上面記錄著某一位員工每天的工作小時數。我們認為當員工一天中的工作小時數大於 8 小時的時候,那麼這一天就是 勞累的一天 所謂 表現良好的時間段 意味在這段時間內,勞累的天數 是嚴格 大於 不勞累的天數 請你返回 表現良好時間段 的最大長度。解題思路...