-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfindRange.java
More file actions
70 lines (65 loc) · 1.72 KB
/
findRange.java
File metadata and controls
70 lines (65 loc) · 1.72 KB
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
60
61
62
63
64
65
66
67
68
69
70
public int[] findRange(int[] num, int target){
if(num.length == 1){
return (num[0] == target)? new int[]{0, 0} : new int[]{-1, -1};
}
int start = 0;
int end = num.length - 1;
while(start <= end){
int mid = (start + end) / 2;
if(num[mid] == tartet){
int[] left_range = findRange(Arrays.copyOfRange(num, start, mid), target);
int[] right_range = findRange(Arrays.copyOfRange(num, mid+1, end+1), target);
int left_index = (left_range[0] == -1)? mid : left_range[0] + start;
int right_index = (right_range[1] == -1)? mid : right_range[1] + mid;
return new int[]{left_index, right_index};
}
if(num[mid] > target){
end = mid - 1;
}else{
start = mid + 1;
}
}
return new int[]{-1, -1};
}
public int[] findRange(int[] num, int target){
if(num == null) return new int[]{-1, -1};
int index_l = findLeft(num, 0, num.length-1, target);
int index_r = findRight(num, 0, num.length-1, target);
return new int[]{index_l, index_r};
}
private int findLeft(int[] num, int start, int end, int target){
if(start >= end){
return num[start] == target ? start : -1;
}
while(start <= end){
int mid = (start + end) / 2;
if(num[mid] == target){
int index = findLeft(num, start, mid - 1, target);
return index == -1 ? mid : index;
}
if(num[mid] > target){
end = mid - 1;
}else{
start = mid + 1;
}
}
return -1;
}
private int findRight(int[] num, int start, int end, int target){
if(start >= end){
return num[end] == target ? end: -1;
}
while(start <= end){
int mid = (start + end) / 2;
if(num[mid] == target){
int index = findRight(num, mid + 1, end, target);
return index == -1 ? mid : index;
}
if(num[mid] > target){
end = mid - 1;
}else{
start = mid + 1;
}
}
return -1;
}