/**
* 功能:在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i]=i。
* 给定一个有序整数数组,元素值各不相同,找出一个魔术索引。
*
* 进阶:如果数组元素有重复值,如何处理
方法二:
* 功能:在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i]=i。
* 给定一个有序整数数组,元素值各不相同,找出一个魔术索引。
*
* 进阶:如果数组元素有重复值,如何处理
*/
两种方法:
方法一:
//穷举法
public static int getMagicIndex(int[] array){
for(int i=0;i<array.length;i++){
if(array[i]==i)
return i;
}
return -1;
}
方法二:
//二分查找法
/**
* 思路:利用数组有序的特点,运用模式匹配法。
* @param array
* @return
*/
public static int getMagicIndex2(int[] array){
return judge(array,0,array.length-1);
}
public static int judge(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 judge(array,mid+1,end);
else
return judge(array,start,mid-1);
}
进阶:
//进阶:如果数组元素有重复值
public static int getMagicIndex3(int[] array){
return judge2(array,0,array.length-1);
}
public static int judge2(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(midIndex==midValue)
return midIndex;
//搜索左半部分
int leftIndex=Math.min(midIndex-1, midValue);
int left=judge2(array,start,leftIndex);
if(left>=0)
return left;
//搜索右半部分
int rightIndex=Math.max(midIndex+1, midValue);
int right=judge2(array,rightIndex,end);
return right;
}