旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
算法分析
1.最首先想到的思路就是遍历数组,直到找到一个数比前面一个数小,则输出这个数,算法的时间复杂度为O(n)。
2.其实可以想到利用二分的思想进行优化:
(1)首先计算mid = (start + end) / 2
(2)若mid上的值比start的值小,则说目标在mid的左边;若mid的值比end上的值大,则说明目标在mid的右边;否则可以将end - 1来缩小范围。此处需要注意不可以用start + 1来替代end - 1,因为我们找的时候是要发现前面的数大于后面的数,所以不能丢失前面的信息。
代码
class Solution(object):
def minArray(self, numbers):
start = 0
end = len(numbers) - 1
while start <= end:
mid = (start + end) // 2
if mid - 1 >= start and numbers[mid - 1] > numbers[mid]:
return numbers[mid]
elif mid + 1 <= end and numbers[mid + 1] < numbers[mid]:
return numbers[mid + 1]
if numbers[mid] < numbers[start]:
end = mid - 1
elif numbers[mid] > numbers[end]:
start = mid + 1
else:
end -= 1
return numbers[0]

浙公网安备 33010602011771号