/* * Magic Index: A magic index in an array A[ 1.•.n-1] is defined to be an index such that A[ i] i. Given a sorted array of distinct integers, write a method to find a magic index, if one exists, in array A. FOLLOW UP What if the values are not distinct? * */ public class Main { public static void main(String[] args) { System.out.println("Hello World!"); int[] array1 = new int[] {-40, -20, -1, 1, 2, 3, 5, 7, 9, 12, 13}; int[] array2 = new int[] {-10, -5, 2, 2, 2, 3, 5, 7, 9, 12, 13}; System.out.println(findMagic(array1)); System.out.println(findMagic(array1, 0, array1.length)); System.out.println(findMagicFollow(array2, 0, array2.length)); } //方法1:硬来; public static int findMagic(int[] array) { for(int i = 0; i < array.length; i++) { if(array[i] == i) { return i; } } return -1; } //方法2:二分; public static int findMagic(int[] array, int start, int end) { if(start > end) return -1; int mid = start + (end - start) / 2; if(array[mid] == mid) { return mid; } if(array[mid] < mid) { return findMagic(array, mid + 1, end); } else { return findMagic(array, start, mid - 1); } } //follow up : 有重复数字怎么办,普通的二分法不实用了;两面都要查找到; public static int findMagicFollow(int[] array, int start, int end) { if(start > end) return -1; int mid = start + (end - start) / 2; if(array[mid] == mid) return mid; int left = findMagicFollow(array, start, Math.min(array[mid], mid - 1)); if(left != -1) return left; int right = findMagicFollow(array, Math.max(array[mid], mid + 1), end); return right; } }
Magic Index java 走地牙 CTCI 8.3
最新推荐文章于 2019-04-27 04:27:01 发布