[蓝桥杯备赛]二分查找库函数bisect_left()和bisect_right()

二分查找是基于列表有序的前提下的,bisect()和bisect_right()等同,所以我们只需要了解bisect_left()和bisec_right()的区别即可。

index1 = bisect(ls, x)   #第1个参数是列表,第2个参数是要查找的数,返回值为索引
index2 = bisect_left(ls, x)
index3 = bisec_right(ls, x)

(1)若列表中没有要查找的元素,则bisect_left()与bisect_rignt()返回相同的值,这个值是若该元素插入被查找数列中,使得数列能够有序的合适位置

nums = [2,4,6,8,10,13,14]
index1 = bisect.bisect(ls,7)
index2 = bisect.bisect_left(ls,7)
index3 = bisect.bisect_right(ls,7)
print("index1 = {}, index2 = {}, index3 = {}".format(index1, index2, index3))

结果:

index1 = 3, index2 = 3, index3 = 3

(2)若列表中只有一个元素等于x,那么bisect_left(ls, x)的值是x在ls中的索引,ls[index2] = x。而bisec_right(ls, x)的值是x在ls中的索引加1。

nums = [2,4,6,8,10,13,14]
index1 = bisect.bisect(ls,8)
index2 = bisect.bisect_left(ls,8)
index3 = bisect.bisect_right(ls,8)
print("index1 = {}, index2 = {}, index3 = {}".format(index1, index2, index3))

结果:

index1 = 4, index2 = 3, index3 = 4

(3)若列表中存在多个元素等于x,那么bisect_left(ls, x)返回最左边的那个索引,此时ls[index2] = x。bisect_right(ls, x)返回最右边的那个索引加1

nums = [2,5,5,5,5,13,14]
index1 = bisect.bisect(ls,5)
index2 = bisect.bisect_left(ls,5)
index3 = bisect.bisect_right(ls,5)
print("index1 = {}, index2 = {}, index3 = {}".format(index1, index2, index3))

结果:

index1 = 5, index2 = 1, index3 = 5

[Leetcode例题]

解答:

 由于数组是有序的,我们可以通过bisect_left(nums,0)先找出第一个0的位置,这个值就是负数的数目,然后通过bisect_rignt(nums,0)找到最右边0的位置,再使用len(nums)减去这个值就是正数的数目。

class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        negiative=bisect_left(nums,0)
        positive=len(nums)-bisect_right(nums,0)
        return max(negiative,positive)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值