剑指offer,page41
题目:数组长度为n+1,数组中元素范围为1-n,找出一个重复的数
分析:使用二分查找,找到1-n范围最中间的那个数,二分这个范围,找到范围之一。例如:将范围二分为[1,m],[m+1,n],如果数组在[1,m]范围的元素个数超过m,则重复发生在1-m之间
def countNum(arr,start,end):
count=0
for x in arr:
if x>=start and x<=end:
count+=1
if count>end-start+1:
return True
else:
return False
def main(arr,start,end):
if len(arr)==0:
return False
if end==start:
print(start)
return
pivot = (start+end)//2
print("pivot is ",pivot)
if countNum(arr,start,pivot):
main(arr,start,pivot)
else:
main(arr,pivot+1,end)
arr = [3,3,4,1,2]
n=4
main(arr,1,4)