leetcode153.题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。

解题思路:1.不管什么题,先简单做出来,增加一下信心吧,直接用min()函数返回最小值
class Solution:
def findMin(self, nums: List[int]) -> int:
return min(nums)
leetcode总是给人惊喜是吧,这是在纵容我堕落吗,写完这句都想挥一挥衣袖,潇洒离去了。
2.二分搜索:本着对技术的执着,还是继续学习二分查找吧。二分查找相信大家都有了解,举个猜数字的游戏到,我写一个数,从range(0,1000)猜出来,聪明的人肯定不会从0开始,一个一个猜,肯定是五百,如果大了,在range(0,500)继续猜,范围直接缩小一半了。那么怎么对一个半有序的数组使用二分查找呢?看图说话

代码如下:
class Solution:
def findMin(self, nums: List[int]) -> int:
#return min(nums)
l = 0
r = len(nums)-1
if len(nums)==1:
return nums[0]
if nums[0]<nums[r]:
return nums[0]
while l<=r:
mid = (l+r)//2
if nums[mid] >= nums[0] :
l = mid+1
elif nums[mid]<nums[0]:
r = mid-1
return nums[l]
这里其实很多边界值挺麻烦的,也是测试才知道的,比如[1]这种长度为1的案例,前面需要加一个判断,还有一种直接升序的[1,2,3,4,5]这种案例,也无法解决掉,在前面加入判断即可。还有直接降序的[2,1]也无法通过,这里是在nums[mid]>nums[0]改为了nums[mid]>=nums[0],最后让l+1,正确通过。
