Medium表現良好的最長時間段 python

2021-10-09 23:12:03 字數 1459 閱讀 8427

給你乙份工作時間表 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 小時的時候,那麼這一天就是 勞累的一天 所謂 表現良好的時間段 意味在這段時間內,勞累的天數 是嚴格 大於 不勞累的天數 請你返回 表現良好時間段 的最大長度。解題思路...