面试题16: 旋转数组最小值

题目: 输入一个递增排序的一个旋转,输出旋转数组的最小值.


分析:

第一步:要知道什么是旋转数组?其实就是将一个有序的数组,前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})
}


猜你喜欢

转载自blog.csdn.net/qq_35191331/article/details/80346888