题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例 1:
输入:[3,4,5,1,2]
输出:1
示例 2:
输入:[2,2,2,0,1]
输出:0
方法一:遍历
算法复杂度
O(N)
解题思路
- 遍历数组,当前元素如果小于下一个元素,继续遍历
- 当前元素如果大于下一个元素,则下一个元素就是最小值
- 遍历完还没有找到,则返回第一个元素
代码实现
func minArray(numbers []int) int {
for i := 0; i < len(numbers)-1; i++ {
if numbers[i] > numbers[i + 1] {
return numbers[i + 1]
}
}
return numbers[0]
}
方法二:二分法
时间复杂度
O(logN)
解题思路
- 利用二分法,取中间值m,如果m大于右边,则说明从m到右边一定有最小值,舍弃左边区间
- 如果m小于右边,则说明右边有序,最小值在m的左边,舍弃右边
- 如果m等于右边,无法确定最小值在哪边。去重,右边移一位继续
代码实现
func minArray(numbers []int) int {
low := 0
high := len(numbers)-1
for low < high {
m := low + (high-low) / 2
if numbers[m] > numbers[high] {
low = m + 1
} else if numbers[m] < numbers[high] {
high = m
} else {
high--
}
}
return numbers[low]
}