二分查找是基于列表有序的前提下的,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)