问题描述:
1, 2, 3, 4, 5的旋转数组为:3, 4, 5, 1, 2要查询找到数组中的最小元素。时间复杂度小于O(N)。
问题思路
可以设置三个标志位left,right,mid来减少查询长度。定义3,4,5为原序序列;1,2为翻转子序列。如果中间元素array[mid]小于左边元素array[left],那么证明,中间元素属于翻转子序列。此时最小元素存在于标志位left->mid之间;同理可得,当中间元素大于左边元素时,最小元素存在于标志位mid->right直接。
代码实现
array = [3, 4, 5, 1, 2]
left, right = 0, len(array)-1
mid = int((left + right) / 2)
def find_min_num(left, mid, right):
if array[mid] > array[left]:
while mid < right:
if array[mid] < array[right]:
print(array[mid])
break
mid += 1
else:
while left < mid:
if array[left] < array[mid]:
print(array[left])
break
left += 1
find_min_num(left, mid, right)