leetcode二分查找整理
经典二分查找
#查第一次比target大的位置
#不过目标值在数组末尾的时候查不到 初始化firstbig=len(nums)
low = 0
high = len(nums)-1
while low <= high:
mid = (low + high) //2
if nums[mid] > target:
high = mid - 1
firstbig = mid
else:
low =mid + 1
#查target第一次出现的位置
low = 0
high = len(nums)-1
while low <= high:
mid = (low + high) //2
if nums[mid] >= target:
high = mid - 1
firstshow = mid
else:
low = mid + 1
bisect二分查找库
import bisect
data=[5,3,6,2,8]
data.sort()
data
Out:[2, 3, 5, 6, 8]
insort和bisect
#查找该数值将会被插入的位置,并将其插入
bisect.insort(data,4)
print(data)
Out:[2, 3, 4, 5, 6, 8]
#查找该数值将会被插入的位置并返回,但是并不将其插入
bisect.bisect(data,2)
Out: 1
insort_left && insort_right
bisect_left && bisect_right
可以看到bisect默认和bisect_right一致
如果采用bisect_left,可以等价为是查找已经存在值2的下标
力扣题目
import bisect
class Solution:
def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]:
#快捷写法 median = lambda a: (a[(len(a)-1)//2] + a[len(a)//2]) / 2
def median(a):
return ((a[(len(a)-1)//2]+a[len(a)//2])/2)#这边求中位数也值得学习
sw = sorted(nums[:k])
arr = [median(sw)]
i=0
while i<len(nums)-k:
sw.pop(bisect.bisect_left(sw, nums[i]))#这边二分查找nums[i]元素在sw里的下标pop之后最快
bisect.insort(sw,nums[i+k])
arr.append(median(sw))
i+=1
return arr
sw.remove(nums[i]) 或 sw.pop(sw.index(nums[i]))
都比上面的那行pop慢了很多很多