本文主要是介绍python实现的lower_bound和upper_bound,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. lower_bound(nums, target)
在非递减数组nums中,lower_bound(nums, target)返回第一个大于等于target的值得位置,如果nums中元素均小于target(即不存在>=target的元素),则返回nums的长度(即target如果要插入到nums中,应该插入的位置)
#coding=utf-8
#返回nums中第一个>=target的值得位置,如果nums中都比target小,则返回len(nums)
def lower_bound(nums, target):low, high = 0, len(nums)-1pos = len(nums)while low<high:mid = (low+high)/2if nums[mid] < target:low = mid+1else:#>=high = mid#pos = highif nums[low]>=target:pos = lowreturn pos
测试:
nums = [10, 10, 10, 20, 20, 20, 30, 30]
print lower_bound(nums, 9),
print lower_bound(nums, 10),
print lower_bound(nums, 15),
print lower_bound(nums, 20),
print lower_bound(nums, 25),
print lower_bound(nums, 30),
print lower_bound(nums, 40)
运行结果:
2. upper_bound(nums, target)
在非递减数组nums中,upper_bound(nums, target)返回第一个大于target的值的位置,如果nums中元素均小于等于target(即不存在>target的元素),则返回nums的长度(即target如果要插入到nums中,应该插入的位置)
#返回nums中第一个>target的值得位置,如果nums中都不比target大,则返回len(nums)
def upper_bound(nums, target):low, high = 0, len(nums)-1pos = len(nums)while low<high:mid=(low+high)/2if nums[mid]<=target:low = mid+1else:#>high = midpos = highif nums[low]>target:pos = lowreturn pos
测试:
nums = [10, 10, 10, 20, 20, 20, 30, 30]
print upper_bound(nums, 9),
print upper_bound(nums, 10),
print upper_bound(nums, 15),
print upper_bound(nums, 20),
print upper_bound(nums, 25),
print upper_bound(nums, 30),
print upper_bound(nums, 40)
运行结果:
c++ lower_bound源码参考:http://www.cplusplus.com/reference/algorithm/lower_bound/
c++ upper_bound源码参考:http://www.cplusplus.com/reference/algorithm/upper_bound/
这篇关于python实现的lower_bound和upper_bound的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!