forked from Turingfly/cracking-the-coding-interview
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMagicIndex.java
59 lines (52 loc) · 1.28 KB
/
MagicIndex.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package chapter08RecursionAndDynamicProgramming;
/**
*
* Problem: A magic index in an array A[0...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 exits, in array A.
*
* Follow up: what is the value are not distinct?
*
*/
public class MagicIndex {
public int magic(int[] array) {
return magic(array, 0, array.length - 1);
}
private int magic(int[] array, int left, int right) {
if (right < left) {
return -1;
}
int mid = left + (right - left) / 2;
if (array[mid] == mid) {
return mid;
} else if (array[mid] > mid) {
return magic(array, left, mid - 1);
} else {
return magic(array, mid + 1, right);
}
}
// follow up
public int magic2(int[] array) {
return magic2(array, 0, array.length - 1);
}
private int magic2(int[] array, int left, int right) {
if (right < left) {
return -1;
}
int mid = left + (right - left) / 2;
int midVal = array[mid];
if (midVal == mid) {
return mid;
}
// search left
int leftIndex = Math.min(mid - 1, midVal);
int l = magic2(array, left, leftIndex);
if (l >= 0) {
return l;
}
// search right
int rightIndex = Math.max(mid + 1, midVal);
int r = magic2(array, rightIndex, right);
return r;
}
}