旋转数组的最小数字

http://www.cnblogs.com/cobbliu/archive/2012/08/30/2662977.html


按照http://zhedahht.blog.163.com/blog/static/25411174200952765120546/上面所讲的,如果是严格递增的序列,就可以用上述算法,但是,如果是101111这样的序列,上述算法不能正确解决


可以在上面修改,就是如果arry[mid],arry[start]和arry[end]三个数相等,就只能使用顺序查找

也可以同时调整start和end的位置

int findMin(int *arr,int start, int end){  
	//start指向前面递增数组的最后一个,而end指向后面递增数组的第一个
	while (start + 1 <end) {
		
		int mid = start + (end - start)/2;
		if (arr[mid] == arr[start] && arr[mid] == arr[end]){
			if (arr[start + 1] >= arr[start])
				++start;
			else
				return start + 1;
			
			if (arr[end - 1]<=arr[end])
				--end;
			else
				return end;
			
		}
		else {
			if (arr[mid]>=arr[start]) {
				start = mid;
			}
			else if(arr[mid]<= arr[end])
				end = mid;
		}

	}

	return end;
}  

int main(int argc, char* argv[])  
{  
	int arr[] = {2,2,3,1,2,2,2,2};  

	printf("%d\n",findMin(arr,0,7));  

	getchar();  
	return 0;  
}  

int minNum(int arry[],int len)//返回最小数的值
{
    if(arry==NULL||len<=0)
        throw exception("非法输入");

    int start=0;
    int end=len-1;
    while(arry[start]>=arry[end])
    {
        if(end-start==1)//如果start和end相差1则返回arry[end]
            return arry[end];

        int mid=(start+end)/2;
        //如果arry[mid],arry[start]和arry[end]三个数相等,就只能使用顺序查找
        if(arry[mid]==arry[start]&&arry[mid]==arry[end])
        {
            int result=arry[start];
            for(int i=start+1;i<=end;i++)
            {
                if(arry[i]<result)
                    result=arry[i];
            }
            return result;
        }

        if(arry[mid]>=arry[start])//如果中间元素大于首元素,则移动首指针
        {
            start=mid;
        }
        else if(arry[mid]<=arry[end])
        {
            end=mid;
        }
    }
    return arry[start];//如果一开始arry[start]<arry[end]表明数组是排序数组,返回arry[start]
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值