思路示意图
- 初始状态,以
最小值为分界,左序列一定大于右序列
pivot在右序列,右序列递增,忽略掉pivot~high之间的元素即可
pivot在左序列,左序列一定比右序列大,因此要在pivot右边开始寻找
4.pivot与high对应元素相等,可以有两种代码实现

代码实现
方法1
class Solution:
def minArray(self, numbers: List[int]) -> int:
start = 0
end = len(numbers)-1
while start < end:
mid = (start + end) // 2
if numbers[end] > numbers[mid]: end = mid
elif numbers[end] < numbers[mid]: start = mid + 1
else: end -= 1
return numbers[start]
方法2
当重复元素,由二分改为遍历
class Solution:
def minArray(self, numbers: List[int]) -> int:
start = 0
end = len(numbers)-1
while start < end:
mid = (start + end) // 2
if numbers[end] > numbers[mid]: end = mid
elif numbers[end] < numbers[mid]: start = mid + 1
else: return findMin(numbers, start, end)
return numbers[start]
def findMin(numbers, start, end):
result = numbers[start];
for i in range(start, end+1):
if (numbers[i] < result) result = numbers[i]
return result