把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2][1,2,3,4,5] 的一个旋转,该数组的最小值为1。 和力扣 154. 寻找旋转排序数组中的最小值 II一致
    示例 1:
    输入:[3,4,5,1,2]
    输出:1
    复杂度分析

    • 时间复杂度:平均时间复杂度为 O(logn),其中 n 是数组 numbers 的长度。如果数组是随机生成的,那么数组中包含相同元素的概率很低,在二分查找的过程中,大部分情况都会忽略一半的区间。而在最坏情况下,如果数组中的元素完全相同,那么 while 循环就需要执行 n 次,每次忽略区间的右端点,时间复杂度为 O(n)。
    • 空间复杂度:O(1)。

      1. //有二分的架子, 没看出二分的内核
      2. func minArray(numbers []int) int {
      3. left := 0
      4. right := len(numbers) -1
      5. for left < right {
      6. pivot := left + (right - left) /2 // pivot = mid
      7. if numbers[pivot] == numbers[right] {
      8. right--
      9. } else if numbers[pivot] < numbers[right] { // target < mid
      10. right = pivot // 可能就是自身,所以没 right = mid -1
      11. } else if numbers[pivot] > numbers[right] {
      12. left = pivot + 1
      13. }
      14. }
      15. return numbers[left]
      16. }