二分查找法

搜索问题:
1 线性结构: 如果有序,可以用二分查找,如果无序要么暴力遍历复杂度O(N)要么先建立二叉搜索树, 然后再查找,此时查找的复杂度是O(H),H为树高度

2 非线性结构,也就是树或者图:深度优先搜索,时间复杂度O(N), 可用栈代替;广度优先搜索,时间复杂度O(N), 可用队列代替。

二分查找:
由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是O(logN) 。二分查找的条件是查找范围不为空,即left<=right 。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = 0 
        right = len(nums) - 1 
        while left <= right:
            mid = (right + left) // 2
            mid_val = nums[mid]
            if target > mid_val:
                left = mid + 1 
            elif target < mid_val:
                right = mid - 1 
            else:
                return mid 
        return -1 
# 在[start,end]中找是否存在target
def find(start, end, target):
    left = start
    right = end
    while left <= right:
        mid = (left + right) // 2
        if mid < target:
            left = mid + 1
        elif mid > target:
            right = mid - 1
        else:
            return mid
    return

print(find(-2, 6, -2))

当需要找到排序好的序列dn里面,小于某个target的后一位数的时候

def bisection_search(dn, target):
    l, r = 0, len(dn) - 1
    while l <= r:
        mid = (l + r) // 2
        if dn[mid] >= target:
            loc = mid
            r = mid - 1
        else:
            l = mid + 1
    return loc

输入[1,1,3], target=1, 结果是0

当需要找到排序好的序列dn里面,小于等于某个target的后一位数的时候

def bisection_search(dn, target):
    l, r = 0, len(dn) - 1
    while l < r:
        mid = (l + r) // 2
        if dn[mid] <= target:
            l = mid + 1
        else:
            r = mid
    return l

输入[1,1,3], target=1, 结果是2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值