forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBinarySearch.java
89 lines (84 loc) · 2.93 KB
/
BinarySearch.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
public class BinarySearch {
public static int search1(int[] nums, int val) {
int n = nums.length;
int low = 0, high = n - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (nums[mid] < val) {
low = mid + 1;
} else if (nums[mid] > val) {
high = mid - 1;
} else {
// 如果nums[mid]是第一个元素,或者nums[mid-1]不等于val
// 说明nums[mid]就是第一个值为给定值的元素
if (mid == 0 || nums[mid - 1] != val) {
return mid;
}
high = mid - 1;
}
}
return -1;
}
public static int search2(int[] nums, int val) {
int n = nums.length;
int low = 0, high = n - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (nums[mid] < val) {
low = mid + 1;
} else if (nums[mid] > val) {
high = mid - 1;
} else {
// 如果nums[mid]是最后一个元素,或者nums[mid+1]不等于val
// 说明nums[mid]就是最后一个值为给定值的元素
if (mid == n - 1 || nums[mid + 1] != val) {
return mid;
}
low = mid + 1;
}
}
return -1;
}
public static int search3(int[] nums, int val) {
int low = 0, high = nums.length - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (nums[mid] < val) {
low = mid + 1;
} else {
// 如果nums[mid]是第一个元素,或者nums[mid-1]小于val
// 说明nums[mid]就是第一个大于等于给定值的元素
if (mid == 0 || nums[mid - 1] < val) {
return mid;
}
high = mid - 1;
}
}
return -1;
}
public static int search4(int[] nums, int val) {
int n = nums.length;
int low = 0, high = n - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (nums[mid] > val) {
high = mid - 1;
} else {
// 如果nums[mid]是最后一个元素,或者nums[mid+1]大于val
// 说明nums[mid]就是最后一个小于等于给定值的元素
if (mid == n - 1 || nums[mid + 1] > val) {
return mid;
}
low = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = {1, 2, 2, 2, 2, 8, 9};
System.out.println(search1(nums, 2)); // 1
System.out.println(search2(nums, 2)); // 4
System.out.println(search3(nums, 2)); // 1
System.out.println(search4(nums, 2)); // 4
}
}