[leetcode]经典二分查找+python快速二分查找

经典二分查找

34. 在排序数组中查找元素的第一个和最后一个位置

		#查第一次比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的下标

力扣题目

480.滑动窗口中位数

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

python 删除元素的三种方法

sw.remove(nums[i]) 或 sw.pop(sw.index(nums[i]))

都比上面的那行pop慢了很多很多

滑动窗口写法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值