1.一个有序数组1,2,3,4,5,6,7,8,9,但是被截断处理了,变成了5,6,7,8,9,1,2,3,查找数组的最小值(旋转数组求最小值)
最小元素位于end-start==1的位置
循环条件是array[start]>array[end]
特殊情况:
(1)旋转0个元素,第一个元素是最小值,因此mid初始值为start
(2)1 0 1 1 1,只能采用按顺序查找的方法
def searchMin(array):
if len(array)==0:
return -1
i=0
j=len(array)-1
mid=i
while(array[i]>=array[j]):
if(j-i==1):
mid=j
break
mid=(i+j)/2
if(array[i]==array[mid]&array[mid]==array[j]):
return minOrder(array,i,j)
if array[mid]>=array[i]:
i=mid
elif array[mid]<=array[j]:
j=mid
return mid
def minOrder(array,i,j):
result=array[i]
for k in range(i+1,j):
if result>array[k]:
result=array[k]
return result
2.一个有序数组1,2,3,4,5,6,7,8,9,但是被截断处理了,变成了5,6,7,8,9,1,2,3,请问要查找其中一个数如何查找
int find(int arr[], int key) arr是数组,n是数组大小,key是查找的值
这道题是题目1的变种
思路:
(1)找到旋转数组里的最小值位置(题目1)
(2)通过最小值将整个数组划分为两个有序数组
(3)通过二分查找找到指定数字,如果key>array[0]则key位于前面的数组中,否则在后一数组中查找key。
def SearchMinNum(array,key):
if len(array)==0:
return -1
start=0
end=len(array)-1
minNumAt=searchMin(array) //调用题1函数
if key>=array[start]:
return BinarySearch(array,start,minNumAt-1,key)
else:
return BinarySearch(array,minNumAt,end,key)
def BinarySearch(array,start,end,key): //二分查找
if len(array)==0:
return -1
while(start<=end):
mid=(start+end)/2
if(array[mid]==key):
return mid
elif(array[mid]>key):
end=mid-1
elif(array[mid]<key):
start=mid+1
return -1
if __name__=="__main__":
array=[5,6,7,8,9,2,3]
numAt=SearchMinNum(array,3)
if numAt<0:
print 'the array in not include the key'
else:
print 'the key at '+str(numAt)