1 从有序数组中查找数组中比某个数大的或比某个数小的第一个数
用二分搜索查找数组中比某个数大的或比某个数小的第一个数。例如在数组中查找比7大的数为8,比7小的数为6,如果能查找到则返回对应数的索引。如果返回的索引查处的数组sums的取值范围说明没找到合适的值
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
0 | 2 | 5 | 6 | 8 | 12 |
-查找比某个数大的第一个数Python代码如下
def searchFirstBigThan(left, right, key, sums):
while(left <= right):
mid = (left + right) / 2
if(sums[mid] >= key):
right = mid - 1
else:
left = mid + 1
return left
- 查找比某个数小的第一个数的Python代码为:
def searchFirstLessThan(left, right, key, sums):
while(left <= right):
mid = (left + right) / 2
if(sums[mid] <= key):
left = mid + 1
else:
right = mid - 1
return right
测试代码
sums=[0,2,5,6,8,12,15]
r = searchLessThan(0, 6, 16, sums)
2 从部分排序的数组中找出最小值
例如数组num=[6,7,8,9,-4,-3,-2,-1,0],其中子数组[6,7,8,9]和[-4,-3,-2,-1,0]是有序的。[-4,-3,-2,-1,0]与[6,7,8,9]合并在一起是整个有序的。要求从[6,7,8,9,-4,-3,-2,-1,0]中找出最小值-4。用二分查找,low与up分别指向数组的首尾,mid=(low+up)/2,如果num[mid]>num[up],说明最小值在[mid+1,up]间,关系low=mid+1,如果num[mid]
def searchMin(num):
low = 0
up = len(num) - 1
while(low < up):
mid = (low + up) / 2
if(num[mid] > num[up]):
low = mid + 1
elif(num[mid] < num[up]):
up = mid
return low
测试代码
sums = [6,7,8,9,-4,-3,-2,-1,0]
r = searchMin(sums)