zoukankan      html  css  js  c++  java
  • 二分查找及几种变体的Python实现

    1. 在不重复的有序数组中,查找等于给定值的元素

    循环法

    def search(lst, target):
    	n = len(lst)
    	if n == 0:
    		return -1
    	
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low)//2 + low
    		if lst[mid] == target:
    			return mid
    		elif lst[mid] < target:
    			low = mid +1
    		elif lst[mid] > target:
    			high = mid -1
    	return -1
    

    递归法

    def search2(lst, target, low, high):
    	if low > high:
    		return -1
    	
    	mid = (high-low)//2 + low
    	if lst[mid] == target:
    		return mid
    	elif lst[mid] < target:
    		return search2(lst, target, mid+1, high)
    	elif lst[mid] > target:
    		return search2(lst, target, low, mid-1)
    

    2. 查找第一个值等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] > value:
    			low = mid - 1
    		elif lst[mid] == value:
    			if mid == 0 or lst[mid-1] != value:
    				return mid
    			else:
    				high = mid - 1
    	return -1
    

    3. 查找最后一个值等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] > value:
    			high = mid - 1
    		elif lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] == value:
    			if mid == n-1 or lst[mid+1] != value:
    				return mid
    			else:
    				low = mid + 1
    	return -1
    

    4. 查找第一个大于等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] < value:
    			low = mid + 1
    		elif lst[mid] >=value:
    			if mid == 0 or lst[mid-1] < value:
    				return mid
    			high = mid - 1
    

    5. 查找最后一个小于等于给定值的元素

    def bsearch(lst, value):
    	n = len(lst)
    	if n == 0:
    		return -1
    	low = 0
    	high = n - 1
    	while low <= high:
    		mid = (high-low) // 2 + low
    		if lst[mid] > value:
    			high = mid - 1
    		elif lst[mid] <= value:
    			if mid == n-1 or lst[mid+1] > 0:
    				return mid
    			low = mid + 1
    	return -1
    
  • 相关阅读:
    ubuntu16.04左边栏图标效果设置
    VMware虚拟机 Ubuntu 16.04 安装 VMware Tools
    微信换取openid的值
    thinkphp关于T方法
    Think关于循环的事
    base64格式转换为图片
    Think视图模型格式
    thinkphp里多表事务
    ThinkPHP数据库驱动之mysql事物回滚
    webhook是啥?
  • 原文地址:https://www.cnblogs.com/leisurelylicht/p/er-fen-cha-zhao-ji-ji-zhong-bian-ti-dePython-shi-x.html
Copyright © 2011-2022 走看看