题目描述: 11、寻找旋转排序数组中的最小值
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
分析:不要一拿到题就遍历!!看看题目描述,这个列表是有特点的。
打破遍历思维,增加二分法思维!
打破遍历思维,增加二分法思维!
(注意点写在了注释里)
# 采用二分法来处理
class Solution:
def findMin(self, nums) :
l = 0 # 指向列表第一个元素
r = len(nums)-1 # 指向列表最后一个元素
if nums[l]<nums[r] or len(nums)==1: # 如果是未旋转过的,或者列表只有一个元素
return nums[l]
while l<r: # 循环条件的设计:这个很重要,学习经验
mid = (l+r)//2 # 看看是怎么取得中间元素的下标
if nums[mid]>nums[l]: # 如果中间元素比‘头’大
l = mid
elif nums[mid]<nums[r]: # 如果中间元素比‘尾‘小
r = mid
# elif nums[mid]==nums[l] and nums[l]==nums[r]: # 加这一段是对付[1,0,1,1,1]
# minn = nums[0]
# for i in range(1,len(nums)):
# if nums[i]<=minn:
# return nums[i]
else: # 能这么写是因为,原列表升序,尾肯定代表的是较小的数
return nums[r]
s = Solution()
#nu = [1,0,1,1,1]
nu = [3,4,5,1,2]
s.findMin(nu)