4種常見的二分查找變形問題
- 查找第一個值等于給定值的元素
- 查找最后一個值等于給定值的元素
- 查找第一個大于等于給定值的元素
- 查找最后一個小于等于給定值的元素
查找第一個值等于給定值
這里都默認數據是從小到達有序排序。
def search_first_equal(array, value):
low = 0
high = len(array) - 1
while low <= high:
mid = low + ((high-low)>>1)
if array[mid] == value:
if mid == 0 or array[mid-1] != value:
return mid
else:
high = mid - 1
elif array[mid] < value:
low = mid + 1
else:
high = mid - 1
return -1
思路是在找到mid的值等于value時,我們要知道mid之前是否有相同值的數據,那怎么判斷呢:如果mid==0,那么說明在它前面沒有元素了, 返回mid;如果mid前一個元素不等于value,那么該mid就是對應第一個值的元素位置。
查找最后一個值等于給定值的元素
def search_last_equal(array, value):
low = 0
high = len(array) - 1
while low <= high:
mid = low + ((high-low)>>1)
if array[mid] == value:
if mid == len(array)-1 or array[mid+1] != value:
return mid
else:
low = mid + 1
elif array[mid] < value:
low = mid + 1
else:
high = mid - 1
return -1
這個就很簡單了,理解了前面的思路就行。
查找第一個大于等于給定值的元素
def search_first_greater_or_equal(array, value):
low = 0
high = len(array) - 1
while low <= high:
mid = low + ((high-low)>>1)
if array[mid] >= value:
if mid == 0 or array[mid-1] < value:
return mid
else:
high = mid - 1
else:
low = mid + 1
return -1
查找最后一個小于等于給定值的元素
def search_last_less_or_equal(array, value):
low = 0
high = len(array) - 1
while low <= high:
mid = low + ((high-low)>>1)
if array[mid] <= value:
if mid == len(array) - 1 or array[mid+1] > value:
return mid
else:
low = mid + 1
else:
high = mid - 1
return -1