本题大多数都使用二分来做,pyhton实现时,用二分最后三个点出现超时,可能是有一部分代码未优化,先放出二分代码供参考学习。
# 读入数据
n, m = map(int, input().split())
numberA = list(map(int, input().split()))
numberB = list(map(int, input().split()))
numberB.sort()
# 标记切割点
states = [False] * n
ans = 0
# 遍历A列表 在B中查找当前的数是否为分割点
for i in range(n):
left = 0
right = m - 1
while left < right:
mid = (left + right) // 2
if numberA[i] <= numberB[mid]:
right = mid
else:
left = mid + 1
if numberB[left] == numberA[i]:
states[i] = True
# 标记完成后进行处理
# 按照线段个数进行处理
# 成为分割后线段的条件
# 本身没有被切割, 上一节点被切割了 或 是开头
for i in range(n):
if not states[i] and (0 == i or states[i - 1]):
ans += 1
print(ans)
二分算法,在最后三个测试数据出现超时,下面为优化版本 空间换时间
用数组标记排序后的分割点,遍历需要分割的片段,标记分割点
n, m = map(int, input().split())
numberA = list(map(int, input().split()))
numberB = list(map(int, in

最低0.47元/天 解锁文章
4245

被折叠的 条评论
为什么被折叠?



