python求助,最后一个点TLE其他AC

P2249 【深基13.例1】查找

MC_xjhjdA @ 2024-06-12 16:19:10

a,b=map(int,input().split())
l=list(map(int,input().split()))
i=list(map(int,input().split()))
for x in i:
    low=0
    high=len(l)-1
    while low<=high:
        mid=(low+high)//2
        if l[mid]==x:
            while l[mid-1]==x:
                mid-=1
            print(mid+1,end=' ')
            break
        elif l[mid]>x:
            high=mid-1
        elif l[mid]<x:
            low=mid+1
    if l[mid]!=x:
        print(-1,end=' ')

by dry_ @ 2024-06-12 16:28:30

python本来就会慢一些,吧。。。


by Terrible @ 2024-06-12 16:39:30

@MC_xjhjdA 你这个写成 C 语言也不过啊,方法出问题了。

你把中间那个 while l[mid-1]==x:mid-=1 这个东西都不是二分了,是线性枚举,想办法去掉它。

你可以看看这个,虽然附上的代码是 C++

也可以使用标准模块中的二分模块,在网上搜搜 bisect

import bisect
n,m=map(int,input().split())
l=list(map(int,input().split()))
for x in map(int,input().split()):
    p=bisect.bisect_left(l,x)
    #p==n 就是找到末尾了
    if p==n or l[p]!=x:print(-1,end=' ')
    else:print(p+1,end=' ')
    # l 下标从 0 开始,题目是下标 1 开始

by MC_xjhjdA @ 2024-06-12 16:51:31

@Terrible 谢谢,解决了


|