【剑指offer】8,旋转数组找最小值

解决一个旋转非递减排序数组的最小值问题,通过二分查找法来确定最小值的位置。在数组旋转后分成两部分的情况下,比较中间元素与尾部元素的大小关系来缩小搜索范围。如果中间元素等于尾部元素,则可能需要顺序查找。代码实现中需要注意处理所有元素相等的情况。
摘要由CSDN通过智能技术生成

题目描述
题目描述

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

思路:根据题目特点,我们可以看到这个旋转将数组分成了两段 {345}一段,{12}一段。我们要求的是在第二段(如果有)的第一个数字。所以可以用两个指针指向首位数字,然后再取中间位次的数,判断这个数和尾部数字大小

  1. 如果,a[mid]>a[tail] ,说明了这个中间的数是处于第一段里面。否则就处于第二段里面
  2. 如果是和最后一个数字相等,并且和第一个数字相等 ,此时应该顺序查找。
  3. 如果和最后一个数字相等,并且a[mid] < a[head],那么end=mid,最小值在前部分。(因为第一个数小于最后一个数的情况一开始就被排除了所以不考虑)
    【并且注意】在你用求中值时候,对于两个相邻的两个数,mid是一定等于前面那个数!
    ps: 如果是在笔试,并且要求没有不能用sort函数,就用快速排序函数 ,输出数组第一个数字

代码
这种解法有问题,就是没有考虑当出现的数字都一样,最小那个数在前或后的情况

  int minNumberInRotateArray(vector<int> rotateArray) {
   
     if(rot
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值