已知一个数组A[0..n-1]和其大小n(不下降序列,元素值可能相同),判断是否存在A[i]=i,返回值为bool,要求时间复杂度小于o(n)。
测试样例:
[1,1,3,4,5]
返回:true
public boolean findMagicIndex(int[] A, int n) { // write code here int head = 0; int tail = n-1; return check(A, head, tail); } public boolean check(int [] A , int left, int right){ if(left > right){ return false; } int mid = (left + right) /2; int start = mid ; int end = mid ; while(mid != 0 && A[mid] == A[start-1]){ start--; } while(mid != A.length-1 && A[mid] == A[end+1]){ end++; } if(start <= A[mid] && A[mid] <= end && start != end){ return true; } return check(A, left, start-1) || check(A, end + 1, right); }
import java.util.*; public class MagicIndex { public boolean findMagicIndex(int[] A, int n) { // write code here return find(A, 0, n - 1); } private boolean find(int[] A, int lo, int hi) { if (lo > hi) return false; int mid = (lo + hi) / 2; if (A[mid] == mid) { return true; } else if (A[mid] < mid) { return find(A, lo, A[mid]) || find(A, mid + 1, hi); } else { return find(A, lo, mid - 1) || find(A, A[mid], hi); } } }
import java.util.*; public class MagicIndex { public static boolean findMagicIndex(int[] A, int n) { return twoFen(A, 0, n - 1); } public static boolean twoFen(int[] A, int begin, int end) { if (begin > end) { return false; } int mid = (begin + end + 1) / 2; if (A[mid] == mid) { return true; } else { return twoFen(A, begin, mid - 1) || twoFen(A, mid + 1, end); } } }