面试题8 旋转数组的最小数字

来源:互联网 发布:vs源码加密 编辑:程序博客网 时间:2024/05/01 19:03
/*在面试中信手写出二分查找的循环和递归代码。
  在排序的数组中查找一个数字或者某个数字出现的次数,都可以尝试使用二分查找算法。
  能够从额外空间消耗、平均时间复杂度和最差时间复杂度比较插入排序、冒泡排序、归并排序、快速排序等不同算法的优劣。
  写出快速排序的代码是很多公司的喜好要求。
  
  面试题8
  题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为旋转数组。输入一个数组的旋转,输出数组的最小数字。
  应该考虑到:旋转数组是排序数字本身的情况,以及两个指针和中间数字三者相等的情况,只能使用顺序查找。
*/
int Min(int* numbers,int length)
{
if(numbers==NULL||length<=0)
throw new std::exception("Invalid paramters");
int index1=0;
int index2=length-1;
int indexMid=index1;
while(numbers[index1]>=numbers[index2])
{
if(index2-index1==1||index2-index1==0)//两个指针差为1时,第二个指针指向的就是最小的数字。
//当数组中只有一个数字时,原来的代码是直接跳转到顺序查找,我认为这时可以直接跳出循环,因此将原来的if(index2 - index1 == 1) //修改为if(index2-index1==1||index2-index1==0),这样在顺序查找的循环中使用了C++标准的循环方式i!=index2
{
indexMid=index2;
break;
}
indexMid=(index1+index2)/2;
if(numbers[index1]==numbers[indexMid]&&numbers[index1]==numbers[index2])//三个数字相等时,顺序查找最小数字。
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=index1+1;i!=index2;++i) //原来的代码是 i <= index2,我做了修改更符合C++的习惯
{
if(result>numbers[i])
result=numbers[i];
}
return result;
}
/*测试用例包括:升序的旋转数组,升序的数组,只包含一个数字的数组,NULL指针。
0 0
原创粉丝点击