Magic Index java 走地牙 CTCI 8.3

/*
* 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章