旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转。输入一个递增排序的数组的一个旋转,如{3,4,5,1,2},求该数组的最小值。

当然很容易想到一个个遍历一遍就能找到。

这里我们要灵活运用二分查找算法的思维方式。既然原来的数组是递增排序的,旋转后可以发现数组可以分为2部分,他们分别是递增排序的。

int Min(int* number, int length)
{
    if( number == NULL || length <= 0 )
        throw new exception("Invalid");

    int indexofstart=0;
    int indexofend = length -1;
    int indexMid = indexofstart; //初始化为第一个元素。为了支持特殊情况:旋转0个元素即无变化。

    while( number[indexofstart] >= number[indexofend])
    {
        if(indexofend - indexofstart == 1)
        {
            indexMid = indexofend;
            break;
        }

        indexMid  = (indexofend + indexofstart)/2; //注意这里是+;
        if( number[indexMid] >= number[indexofstart])
        {
            indexofstart = indexMid;
        }
        else if( number[indexMid] <= number[indexofend] )
        {
            indexofend = indexMid;
        }

    }
        return number[indexMid];
}

算法还有一个问题是假如数字允许相同那么这个算法就无法找出最小值,例如{1,0,1,1,1}它是{0,1,1,1,1}的旋转。

解决办法就是在循环中添加判断如果下标为indexofstart,indexofend,indexMid 的三个数相同,那么就采用最顺序查找办法。代码略。

posted @ 2013-03-02 21:36  没离开过  阅读(103)  评论(0)    收藏  举报