剑指 Offer 11. 旋转数组的最小数字

本题与154题相同,重做一遍还是有细节问题

 

思路: 

  1. 本题需要找最小数字,在本升序数组中,需想通最小数字就是旋转点

  2. 接着就是二分法

    1) left,right = 0 , len(nums)-1 

    2)   mid =  left + (right-left)//2   这种写法是防止 (right+left) >>1 太大溢出

  3. 细节:

    1) 首先明确在此题中,mid要与right比,而不能与Left比  (我也不知道为啥,用Left就出错) 

    2) 然后是 左右端点的赋值,千万不能用 left = mid+1, right = mid-1 这种将mid直接跳过去;如果是找target ,nums[mid] != target 可以跳过去 

    3)所以,这里要用 left = mid + 1 ,right = mid。

      这是因为mid<right时,有可能mid就是最小值,所以要保留它,写作 right = mid

      而我们的mid取的是左中点,如果更新时写作 left = mid 就永远跳不出去了;   比如  left,right = 2,3   每次mid = 2

      

    if numbers[mid]<numbers[right]:
                right = mid
    
    elif numbers[mid]>numbers[right]:
                left = mid+1

 

 

 

posted @ 2020-09-16 10:04  ChevisZhang  阅读(82)  评论(0编辑  收藏  举报