#思路:,
# 原来有序的数组,右移n位后,以最小值与最大值的临界位置划分,两段各还是有序的。7,8,9,1,2,3,4,5,6
#对于有序的查找,思想是有二分查找。但这是局部有序,所以稍微变点型。
###方法2: 此只是要找最小值(其实找到最小值就是分界点位置了)。
#用二分的思想,可以发现,当middle<end时,则右侧有序(从中间到最后的这段都有序),无序的肯定在左侧即最小值肯定在左侧。只需关注左侧位置了
#当middle>end,这无序的肯定在右侧了。此时可以确定将结果缩小到nums[middle+1 : end]这个范围内。将end返回即为第一个最小值了
# 而当nums[middle]==nums[right]nums[middle]==nums[right]时,无法确定最小值的位置,此时可以做的事情是尽量缩小范围,又因为知道nums[middle]和nums[right]值相同,
# 所以nums[right]可以抛弃,即将结果范围缩小到nums[left : right-1]重新计算(注意,目的是找最小值而不是第一个最小值的位置,
# 所以就算nums[right]是第一个最小值也无关紧要).
###方法2 更好!
class solution:
def findMin(a):
length=len(a)
start=0
end=length-1
while(start<end):
middle=(start+end)//2
if a[middle]<a[end]:
end=middle
elif a[middle]>a[end]:
start=middle+1
return a[start]
s=[7,8,9,10,11,12,13,14,1,2,3,4,5,6]
mins=findMin(s)
print(mins)
### 方法1,先查找到分界点位置,利用二分查找。如果中间值小于start处的值,则分界点在左侧;大于右侧的值,则分解点在右侧。
# 用一个全局变量保留上一个middel值,继续在含分界点处的一侧遍历。当新的middle满足 start<middle<end时,上一个middle即为中间值
#找到中间分界值后,对两个有序遍历各进行二分搜索