今天遇到一个很好用的函数pairwise,含义是:从对象中获取连续的重叠对。
直接上例子:
from itertools import pairwise
a = pairwise('12345')
# 输出的a应为是 12 23 34 45
b = pairwise([1])
# b为空
如果使用for循环遍历它:
from itertools import pairwise
# 示例数据
data = [1, 2, 3, 4, 5]
# 使用 pairwise 遍历
for a, b in pairwise(data):
print(f"({a}, {b})")
#结果:
#(1, 2)
#(2, 3)
#(3, 4)
#(4, 5)
[Leetcode]例题
一些需要的函数:
(1)enumerate() 函数:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
eg:
>>> seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
... print i, element
...
0 one
1 two
2 three
(2)zip()函数:可以将多个可迭代对象(如列表、元组等)中的对应元素打包成一个个元组,然后返回由这些元组组成的对象。如果输入的可迭代对象长度不同,zip() 函数会以最短的对象长度为准进行打包。
eg:
a = [1, 2, 3]
b = [4, 5, 6]
zipped = zip(a, b)
list(zipped) # 输出: [(1, 4), (2, 5), (3, 6)]
遍历多个迭代器:
names = ['John', 'Eric']
ages = [30, 22]
for name, age in zip(names, ages):
print(f"{name} is {age} years old.")
---------------------------------------------------------------------------------------------------------------------------------
例题分析:先预处理出空闲的段,然后对于移动会议,其实就是将相邻的空闲段连接到一起,也就是合并一次就可以多选一个相邻的空闲段,如果有k次合并,那么就是最多可以选k+1个相邻空闲段。那么问题就变为维护一个窗口大小最大为k+1的窗口,滑动窗口解决即可。
代码:
class Solution:
def maxFreeTime(self, eventTime: int, k: int, startTime: List[int], endTime: List[int]) -> int:
meet=[]
for l,r in zip(startTime,endTime):
meet.append([l,r])
#free
arr=[]
if meet[0][0]>0:
arr.append(meet[0][0]-0)
for a,b in pairwise(meet):
arr.append(b[0]-a[1])
if eventTime>meet[-1][1]:
arr.append(eventTime-meet[-1][1])
k+=1
s=res=0
#window
l=0#左边
for r,x in enumerate(arr):
s+=x
res=max(s,res)
if r-l+1==k:
s-=arr[l]
l+=1
return res