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

来源:互联网 发布:网络ssc什么意思 编辑:程序博客网 时间:2024/06/05 14:19

{3,4,5,1,2},比如此处被分为{3,4,5}{1,2}这样连个数组,找中间元素,让其跟元素首元素比较,如果大于首元素,则中间元素属于前半段有序数组,如果小于尾元素,那么中间元素就是后半段的元素。

设定两个指针start和end分别指向数组的首尾元素,然后当start指向前半段最后一个元素,end指向后半段第一个元素,这是程序就找到了数组中的最小元素,就是end指向的那个数,程序的出口就是 end-start==1。

注意: 若数组未旋转,则a[0]<a[length-1], 直接返回a[0]为最小值

          若{1,0,1,1,1}和{1,1,1,0,1},遇到首尾和中间元素相等,则直接采用顺序查找的方法。   

</pre><pre>
#include<iostream>using namespace std;#include<time.h>int Min(int *a,int length){       if(a==NULL || length<=0)throw new std::exception("invalid parameraters");   int p1=0;   int p2=length-1;   int mid=p1;   while(a[p1]>=a[p2])   {   if((p2-p1)==1)       return a[p2];    mid=(p1+p2)/2;   if(a[mid]==a[p1]  && a[mid]==a[p2])   {   int min= a[p1];   for(int i=p1+1;i<p2;i++)   {   if(a[i]<min)   min = a[i];    }   return min;   }    if(a[mid]>=a[p1])   p1=mid;   else if(a[mid]<=a[p2])   p2=mid;   }   return a[p1];}// ====================测试代码====================void Test(int* numbers, int length, int expected){    int result = 0;    try    {        result = Min(numbers, length);        for(int i = 0; i < length; ++i)            printf("%d ", numbers[i]);        if(result == expected)            printf("\tpassed\n");        else            printf("\tfailed\n");    }    catch (...)    {        if(numbers == NULL)            printf("Test passed.\n");        else            printf("Test failed.\n");    }}int main(int argc, char* argv[]){    // 典型输入,单调升序的数组的一个旋转    int array1[] = {3, 4, 5, 1, 2};    Test(array1, sizeof(array1) / sizeof(int), 1);    // 有重复数字,并且重复的数字刚好的最小的数字    int array2[] = {3, 4, 5, 1, 1, 2};    Test(array2, sizeof(array2) / sizeof(int), 1);    // 有重复数字,但重复的数字不是第一个数字和最后一个数字    int array3[] = {3, 4, 5, 1, 2, 2};    Test(array3, sizeof(array3) / sizeof(int), 1);    // 有重复的数字,并且重复的数字刚好是第一个数字和最后一个数字    int array4[] = {1, 0, 1, 1, 1};    Test(array4, sizeof(array4) / sizeof(int), 0);    // 单调升序数组,旋转0个元素,也就是单调升序数组本身    int array5[] = {1, 2, 3, 4, 5};    Test(array5, sizeof(array5) / sizeof(int), 1);    // 数组中只有一个数字    int array6[] = {2};    Test(array6, sizeof(array6) / sizeof(int), 2);    // 输入NULL    Test(NULL, 0, 0);    return 0;}



0 0
原创粉丝点击