把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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)。
//有二分的架子, 没看出二分的内核
func minArray(numbers []int) int {
left := 0
right := len(numbers) -1
for left < right {
pivot := left + (right - left) /2 // pivot = mid
if numbers[pivot] == numbers[right] {
right--
} else if numbers[pivot] < numbers[right] { // target < mid
right = pivot // 可能就是自身,所以没 right = mid -1
} else if numbers[pivot] > numbers[right] {
left = pivot + 1
}
}
return numbers[left]
}