2019独角兽企业重金招聘Python工程师标准>>>
/**
* 功能:在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i]=i。
* 给定一个有序整数数组,元素值各不相同,找出一个魔术索引。
*
* 进阶:如果数组元素有重复值,如何处理
*/
两种方法:
方法一:
[java] view plain copy
- //穷举法
- public static int getMagicIndex(int[] array){
- for(int i=0;i<array.length;i++){
- if(array[i]==i)
- return i;
- }
- return -1;
- }
方法二:
[java] view plain copy
- //二分查找法
- /**
- * 思路:利用数组有序的特点,运用模式匹配法。
- * @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);
- }
进阶:
[java] view plain copy
- //进阶:如果数组元素有重复值
- 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;
- }