Medium表现良好的最长时间段 python

作者:19届 ZCQ

时间:2020-10-3

标签:动态规划

题目描述:

给你一份工作时间表 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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南大学苹果实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值