1 /**
2 * 1.普通二分(递归 && 非递归)
3 * 2.包含重复元素的二分(第一个 && 最后一个)
4 *
5 * @author wzl
6 * @since 2020-10-07
7 */
8 public class 二分相关 {
9 /**
10 * 普通二分非递归
11 */
12 public static int binarySearch_unRecursion(int[] array, int target) {
13 if (array == null || array.length == 0) {
14 return -1;
15 }
16 int left = 0;
17 int right = array.length - 1;
18 while (left <= right) {
19 int mid = (left + right) / 2;
20 if (target == array[mid]) {
21 return target;
22 } else if (target > array[mid]) {
23 left = mid + 1;
24 } else {
25 right = mid - 1;
26 }
27 }
28 System.out.println(left + " " + right);
29 return -1;
30 }
31
32 /**
33 * 普通二分递归
34 */
35 public static int binarySearch_recursion(int[] array, int target, int left, int right) {
36 if (array == null || array.length == 0) {
37 return -1;
38 }
39 if (left <= right) {
40 int mid = (left + right) / 2;
41 if (target == array[mid]) {
42 return target;
43 } else if (target > array[mid]) {
44 return binarySearch_recursion(array, target, mid + 1, right);
45 } else {
46 return binarySearch_recursion(array, target, left, mid - 1);
47 }
48 }
49 return -1;
50 }
51
52 /**
53 * 重复元素二分,第一个重复元素
54 * 找target - 0.5,最后判断left标志位
55 */
56 public static int binarySearch_repeatFirst(int[] arr, int target) {
57 if (arr == null || arr.length < 0) {
58 return -1;
59 }
60 double t = target - 0.5;
61 int left = 0;
62 int right = arr.length - 1;
63 while (left <= right) {
64 int mid = (left + right) / 2;
65 if (t > arr[mid]) {
66 left = mid + 1;
67 }
68 if (t < arr[mid]) {
69 right = mid - 1;
70 }
71 }
72 if (left >= 0 && left <= arr.length - 1 && arr[left] == target) {
73 return left;
74 }
75 return -1;
76 }
77
78 /**
79 * 重复元素二分,最后一个重复元素
80 * 找target + 0.5, 最后判断 right标志位
81 */
82 public static int binarySearch_repeatLast(int[] arr, int target) {
83 if (arr == null || arr.length < 0) {
84 return -1;
85 }
86 double t = target + 0.5;
87 int left = 0;
88 int right = arr.length - 1;
89 while (left <= right) {
90 int mid = (left + right) / 2;
91 if (t > arr[mid]) {
92 left = mid + 1;
93 }
94 if (t < arr[mid]) {
95 right = mid - 1;
96 }
97 }
98 if (right >= 0 && right <= arr.length - 1 && arr[right] == target) {
99 return right;
100 }
101 return -1;
102 }
103 public static void main(String[] args) {
104 int[] arr = {1, 1, 1, 1};
105 System.out.println();
106 }
107 }