面试题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})
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值