题目: 输入一个递增排序的一个旋转,输出旋转数组的最小值.
分析:
第一步:要知道什么是旋转数组?其实就是将一个有序的数组,前n个直接丢到最后面.
根据上面什么是旋转数组,我们可以知道旋转数组会有这样一个规律,就是这个一个递增排序数组的一个旋转,可以看成两个递增数组的组合.有一个核心的地方,就是左边序列的所有值会大于等于右边的值,那么我们就可以使用二分查找.
第二步:使用二分查找,中间的要么在第一个递增序列中,要么在第二个递增序列中
根据这个中间值,我们可以根据这个值与两个序列的进行比较,找出这个中间值在哪个序列.将其分为以下三种情况:
第一种情况:中间值等于最左边的值,此时不太好判断在哪个序列,我们就把左边的往右一步,比如{3,3,3,3,1,2,3},中间值是3
第二种情况:中间值大于最左边的值,中间值在第一个序列
第三种情况:中间值小于最左边的值,中间值在第二个序列
代码实现:
package main func Min(a, b int) int { if a > b { return b } return a } func getMinOfRotation(A []int) { left, right, mid, min := 0, len(A) - 1, 0, A[0] for left < right { mid = left + (right - left) / 2 min = Min(A[mid], min) if A[left] == A[mid] && A[right] == A[mid] { // 第一种情况 left++ } else if A[mid] >= A[left] { // 第二种情况,右边 left = mid + 1 min = Min(A[left], min) } else { // 第三种情况,左边 right = mid - 1 min = Min(A[left], min) } } } func main() { getMinOfRotation([]int{5,6,7,8,1,2}) }