您的位置:首页 > 其它

9.9递归和动态规划(三)——魔术索引

2015-08-08 17:49 260 查看
/**

* 功能:在数组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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: