旋转数组的最小值

问题:
旋转数组即将一递增数组的前若干个数字移动到数组的最后面。现输入一旋转数组,查找数组中的最小值。
分析:
我们可以二维立体直观化:
高度表示值大小,长度表示数组的序号数,理想化为线性增长。
在这里插入图片描述
mid可分为两种种情况:
1.mid值在大块中时,数组[mid]>=数组[end],令start=mid;
2.mid值在小块中时,数组[mid]<数组[end],令end=mid;

#include<iostream>

using namespace std;

int main()
{
    int m;
    cout<<"请输入一维数组的大小:";
    cin>>m;
    int a[m];
    cout<<"请输入数组值:(旋转数组)";
    for(int i=0;i<m;i++)
    {
       cin>>a[i];
    }

    int start,mid,end;
    start = 0;
    end=sizeof(a)/sizeof(a[0])-1;
    mid=(start+end)/2;

    while(start<end)
    {
      if(end-start==1)
      {
          mid=end;
          break;
      }

      mid=(start+end)/2;

      if(a[mid]>=a[end])//满足条件,说明最小值在右边,反之左边
      {
          start=mid;
      }
      else
      {
          end=mid;
      }
    }
    //cout<<start<<end<<mid<<endl//辅助查看start mid end 的指向
    cout<<a[start+1];//加1是因为start+1=end,上面循环跳出条件也是如此

    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值