【牛客网】——旋转数组的最小数字

题目描述:有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

要求空间复杂度为O(1),时间复杂度为O(logn)

这个题目官方给出的解法是二分法,具体怎么使用如下:

首先来分析“非降序数组”,数组既然不是降序的,那么可能有以下几种情况:

1.数组元素升序

2.数组所有元素的值相等

3.数组大体上是升序排列的,有部分元素的值是相等的

基于此可以判断出数组旋转后的特征

1.数组可以分成前后两个区域,前后区域都是递增的趋势

2.如果最小值不在两端,那么left和right之间不会出现多个不等的局部最小值

画出数组旋转后的大致的图像

接下来要讨论的就是arr[mid]和两端的值的大小关系

1.arr[mid]>arr[right] 

此时最小值在mid和right区间内,left=mid+1

2. arr[mid]<arr[right] 

最小值在left和mid区间,right=mid

3.arr[mid]=arr[right]

这种情况下是无法判断最小值的区间的

 

个人想法:让right-1,right减小,mid也减小,arr[mid]和arr[right]的值就会改变,直至出现arr[mid]和arr[right]不相等的情况,如果数组所有情况都相等的话,此时输出任意一位的数字都可以

代码如下:

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    int left=0;
    int right=rotateArrayLen-1;
    while(left<right)
    {
        int mid=(left+right)/2;
        if(rotateArray[mid]<rotateArray[right])
            right=mid;
        else if(rotateArray[mid]>rotateArray[right])
            left=mid+1;
        else
            --right;
    }
    return rotateArray[left];
}

 结果如图:

完 

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星鸦wyk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值