剑指offer-8 旋转数组的最小数字

来源:互联网 发布:js div显示隐藏 编辑:程序博客网 时间:2024/04/30 10:31
#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;int MinOrder(int* data,int index1,int index2);/*    充分利用部分排序的特点----二分法    1、两个指针,初始化为数组的头和尾    2、确定循环的条件*///数组没有重复元素的情况int MinItem(int* a,int length){    if(a==nullptr || length<=0)        exit(EXIT_FAILURE);    int index1 = 0,index2 = length-1;    int indexmid = index1;    while(a[index1] >= a[index2])    {        if(index2-index1 ==1)        {            indexmid = index2;//最小的数一定在后半部分            break;        }        indexmid = (index1+index2)/2;        //index1到indexmid还是递增有序的,最小的数在indexmid---index2        if(a[indexmid]>=a[index1])            index1 = indexmid;        else if(a[indexmid]<=a[index2])            index2 = indexmid;    }    return a[indexmid];}//数组有重复元素int MinItem_1(int* a,int length){    if(a==nullptr || length<=0)        exit(EXIT_FAILURE);    int index1 = 0,index2 = length-1;    int indexmid = index1;    while(a[index1] >= a[index2])    {        if(index2-index1 ==1)        {            indexmid = index2;//最小的数一定在后半部分            break;        }        indexmid = (index1+index2)/2;        //考虑有重复元素的情况        if(a[index1]==a[index2] && a[index1]==a[indexmid])        {            return MinOrder(a,index1,index2);        }        //index1到indexmid还是递增有序的,最小的数在indexmid---index2        if(a[indexmid]>=a[index1])            index1 = indexmid;        else if(a[indexmid]<=a[index2])            index2 = indexmid;    }     return a[indexmid];}int MinOrder(int* data,int index1,int index2){    int result = data[index1];    for(int i = index1+1;i<=index2;i++)    {        if(result > data[i])            result = data[i];    }    return result;}int main(){    int a[] = {5,1,2,3,4};    //int a[] = {1,1,1,0,1};    int temp= MinItem_1(a,5);    cout<<temp<<endl;    return 0;}

0 0