题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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
解答思路
暴力法没新意
使用二分法+暴力法
需要注意二分法可能遇到的问题,因为中间的数据可能存在向下跃迁,找到跃迁,就是找到结果,但是二分法不能很快的检测相邻,所以需要逐渐查找
需要注意{1,1}{1,3}{3,1}{1,3,1}{1,1,1}{3,1,3}
提交结果
package main
import "fmt"
func main() {
a := []int{1,2,1}
fmt.Println(minArray(a))
}
func minArray(numbers []int) int {
//异常一{1,1}
//修改循环判断条件
//判断的是low!=hight
//但是没有给如果不满足循环后的输出
//异常二{3,1}
//更换区间错误
//异常三{3,1}
//mid==low
//说明low和hight相邻
//low=hight
//异常四
//将low=hight放在循环第一节会导致全顺序排列的判断失败,需要将其放入子判断中
//异常五
//当low>hight&&mid==hight
//知道else的作用,就是当if修改了数据,之后的判断又刚好用到该数据,就死亡了
//使用continue跳出本次循环
//异常六{1.2,1}
//
var low, hight, mid int
if len(numbers) == 0 {
return 0
}
if len(numbers) == 1 {
return numbers[0]
}
low = 0
hight = len(numbers) - 1
mid = low + (hight-low)/2
for low != hight {
if numbers[low] < numbers[hight] {
return numbers[low]
}
if numbers[low] == numbers[hight] {
low++
}
if numbers[low] > numbers[hight] {
if numbers[mid] <= numbers[hight] {
hight = mid
mid = low + (hight-low)/2
}
if numbers[mid] > numbers[hight] {
low = mid
mid = low + (hight-low)/2
}
if mid == low {
low = hight
}
}
}
if low == hight {
return numbers[low]
}
return -1
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。