这个题解首先将工作时间hours数组转化为劳累天数标记为1,不劳累天数标记为-1的形式。接着,计算这个转化后的数组的前缀和。如果前缀和大于0,则整个数组都是一个表现良好的时间段,直接返回数组长度。若不是,利用哈希表记录前缀和的最早出现位置。通过检查当前前缀和减去一个目标值(aim = 1)是否存在于哈希表中,来找到最长的表现良好时间段,即找到最早使得累积和大于1的子数组。通过这种方式,我们可以在一次遍历中找到最长的满足条件的子数组长度。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def longestWPI(self, hours: List[int]) -> int:
sum = 0
n = len(hours)
# 将每个工作时长转换为1或-1
for i in range(n):
if hours[i] > 8:
hours[i] = 1
else:
hours[i] = -1
sum += hours[i]
# 如果所有天数加起来劳累的天数更多
if sum > 0:
return n
sum = [0] * n
sum[0] = hours[0]
for i in range(1, n):
sum[i] = sum[i-1] + hours[i]
ans = 0
aim = 1
hash_table = {0: -1}
# 使用哈希表找到最长的表现良好时间段
for i in range(n):
if hash_table.get(sum[i] - aim) is not None:
ans = max(ans, i - hash_table.get(sum[i] - aim))
if hash_table.get(sum[i]) is None:
hash_table[sum[i]] = i
return ans