您的位置:首页 > 其它

查找有序数组中某个数首次出现的位置

2013-12-11 22:47 316 查看
给定一个排序的数组,找出数组中某个元素第一次出现的位置。如果没有找到返回-1.

某次面试时遇到这个题。当时用循环形式的二分查找做的,解决得一般。面试官提示用递归形式的二分查找,没能做出来。

重新思考了下这个问题,发现find2这种递归形式的,的确清晰一些。

但实际上循环形式的二分查找,只需使用一个数组mids,记录每次的mid值,最后返回mids数组末尾元素也可以解决问题。

def find2(arr, low, high, n):
if low > high:
return -1

mid = low + (high - low) / 2
if arr[mid] == n:
index = find2(arr, low, mid - 1, n)
return mid if index == -1 else index
else:
if arr[mid] > n:
return find2(arr, low, mid - 1, n)
else:
return find2(arr, mid + 1, high, n)

def find(arr, n):
low = 0
high = len(arr) - 1

mids = []
while low <= high:
#print low, high
mid = (low + high) / 2
if n < arr[mid]:
high = mid - 1
elif n > arr[mid]:
low = mid + 1
else:
#return mid
mids.append(mid)
high = mid - 1

if len(mids) == 0:
return -1
else:
return mids[len(mids) - 1]

if __name__ == '__main__':
arr = [1, 1, 2, 2, 3, 5, 6, 9, 10, 10, 10, 10, 12, 12, 23, 24, 25]
print find(arr, 1)
print find(arr, 2)
print find(arr, 10)
print find(arr, 12)

print find2(arr, 0, len(arr), 1)
print find2(arr, 0, len(arr), 2)
print find2(arr, 0, len(arr), 10)
print find2(arr, 0, len(arr), 12)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐