旋转数组的最小值(二分法)

题目描述

        把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

题目分析

       根据题目,非减排序意思就是相邻两元素中左边元素时小于等于右边的,关键就在于这个等于了,如同数组[1,1,2,2,3,5,5]就是一个非减排序了。而这道题目就是将这样一个数组的前面一部分放到了末尾,然后求最小值,这该怎么求呢?

       我们可以发现,即使是将前面一部分放到了数组末尾,但是两部分各自都肯定是非减排序的,也就是非严格升序。既然有序,那么就可以考虑二分法了,只不过这里的二分法会有些变化。

        二分法的关键就是根据区间中点值的情况去收缩区间。

        而在这道题中,以[5,5,6,7,7,9,1,1,2,4]为例,其中[5,5,6,7,7,9]是一部分,[1,1,2,4]又是一部分,那么我取的重点值肯定就是在这两部分之中了,那到底在哪一部分呢?就可以有以下情况:

①a[mid]>a[left]。说明中点必定位于较高的那一部分,如上述的[5,5,6,7,7,9],此时的中点必定也不是最小值点,如果要缩小区间那么必定是left=mid+1;但是这里需要注意一点的是,a[left]也有可能就是最小值,不过这前提还必须是a[left]<a[right];

②a[mid]<a[right]。说明中点必定位于较低的那一部分&#

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值