求出有序数组旋转后的最小值

思路:比如123456旋转之后为456123 那么第一个数字肯定大于或者等于最后一个数字,设置两个指针index1和index2,分别指向第一个数和最后一个数,然后求出中间的数,如果中间的数大于第一个数,说明最小的在中间的后面,将index1指向中间的数,否则将index2指向中间的数,缩小查找范围,当Index2在index1后面,就是index2-index1=1的时候,最小的数字就是Index2.


int Min(int* numbers,int length){

if(numbers==null || length==0){
throw new std:exception('Invalid parameters');
}
int index1=0;
int index2=length-1;
int indexMid=0; //当旋转0个元素时,最小的为第一个数,所以indexMid设为0
while(numbers[index1]>=numbers[index2]){  //旋转之后第一个数大于等于最后一个数
if(index2-index1=1){
indexMid=index2;
break;
}
indexMid=(index1+index2)/2;  //中间的数
if(numbers[index1]=numbers[index2]&&numbers[indexMid]
==numbers[index1]){   //如果第一个数等于最后一个数等于中间的数
return MinInOrder(numbers,index1,index2);  //顺序排序求出最小值
}
if(numbers[index1]<=numbers[indexMid]){   //如果第一个数小于中间的数,说明最小的在后面,将指向第一个数的指针指向中间的数,缩小查找范围
index1=indexMid;
}else if(numbers[indexMid]<=numbers[index2]){  //如果中间的数小于最后一个数,说明最小的在中间的前面或者就是中间的数,将第二个指针指向中间的数,缩小查找范围
index2=indexMid;
}
}
return numbers[indexMid];
}
int MinInOrder(int* numbers,int index1,int index2){  //进行顺序排序求最小数的函数
int result=numbers[index1];
for(int i=index+1;i<=index2;++i){
if(numbers[i]<result){
result=numbers[i];
}
}
return result;
}//求出旋转数组中的最小值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值