public static int magicSlow(int[] array)
{
for(int i=0;i<array.length;i++)
{
if(array[i]==i)
{
return i;
}
}
return -1;
}
public static int magicFast(int [] array,int start,int end)
{
if(end<start||start<0||end>array.length){
return -1;
}
int mid=(start+end)/2;
if(array[mid]==mid)
return mid;
else if(array[mid]>mid)
{
return magicFast(array,start,mid-1);
}else
{
return magicFast(array,mid+1,end);
}
}
public static int magicFast(int[] array)
{
return magicFast(array,0,array.length-1);
}
public static int magicFast(int[] array,int start,int end)
{
if(end<start || start<0||end>=array.length)
{
return -1;
}
int midIndex=(start+end)/2;
int midValue=array[midIndex];
if(midValue==midIndex)
{
return midIndex;
}
/*
搜索左半部分
*/
int leftIndex=Math.min(midIndex-1,midValue);
int left=magicFast(array,start,leftIndex);
if(left>=0)
return left;
/*
搜索右半部分
*/
int rightIndex=Math.max(midIndex+1,midValue);
int right=magicFast(array,rightIndex,end);
return right;
public static int magicFast(int[] array)
{
return magicFast(array,0,array.length-1);
}
}
注:如果数组元素各不相同,这个方法的执行动作与第一个解法几近相同。
版权声明:本文为博主原创文章,未经博主允许不得转载。