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

来源:互联网 发布:crypto js 下载 编辑:程序博客网 时间:2024/06/05 06:42
/**
 * 功能:在数组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;}


0 0