题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
即输入数组是一个递增数组在某个位置上进行了旋转。
例如数组[0, 1, 2, 4, 5, 6, 7]可能变为[4, 5, 6, 7, 0, 1, 2]
示例1
输入:[3,4,5,1,2]
输出:1
示例2
输入:[2,2,2,0,1]
输出:0
解题方法:
1、线性遍历
class Solution(object):
def minArray(self, numbers):
"""
:type numbers: List[int]
:rtype: int
"""
if len(numbers) == 0:
return numbers
for i in range(len(numbers) - 1):
if numbers[i] > numbers[i + 1]:
return numbers[i + 1]
else:
i += 1
return numbers[0]
2、二分法 双指针
假设st, end分别为numbers的第一个元素,最后一个元素索引,mid为中间索引(
m
i
d
=
(
s
t
+
e
n
d
)
/
/
2
mid = (st + end ) // 2
mid=(st+end)//2)
如果 numb[mid] > numb[end],说明最小值在mid后面,那么取
s
t
=
m
i
d
+
1
st = mid + 1
st=mid+1
如果 numb[mid] < numb[st],说明最小值在mid前面,那么取
e
n
d
=
m
i
d
end = mid
end=mid
如果 numb[st] < numb[mid] < numb[end],那么end左移一位(线性)
class Solution(object):
def minArray(self, numbers):
"""
:type numbers: List[int]
:rtype: int
"""
if len(numbers) == 0: return numbers
st = 0
end = len(numbers) - 1
middle = (st + end) // 2
while st < end:
if numbers[middle] > numbers[end]: st = middle + 1
elif numbers[middle] < numbers[st]: end = middle
else: end -= 1
middle = (st + end) // 2
return numbers[end]