Skip to content

Commit ae1acd5

Browse files
committed
feat: update binary search algorithm
1 parent 15ca889 commit ae1acd5

File tree

45 files changed

+89
-170
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+89
-170
lines changed

basic/searching/BinarySearch-II/BinarySearch.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public static int search1(int[] nums, int val) {
44
int n = nums.length;
55
int low = 0, high = n - 1;
66
while (low <= high) {
7-
int mid = low + ((high - low) >> 1);
7+
int mid = (low + high) >>> 1;
88
if (nums[mid] < val) {
99
low = mid + 1;
1010
} else if (nums[mid] > val) {
@@ -25,7 +25,7 @@ public static int search2(int[] nums, int val) {
2525
int n = nums.length;
2626
int low = 0, high = n - 1;
2727
while (low <= high) {
28-
int mid = low + ((high - low) >> 1);
28+
int mid = (low + high) >>> 1;
2929
if (nums[mid] < val) {
3030
low = mid + 1;
3131
} else if (nums[mid] > val) {
@@ -45,7 +45,7 @@ public static int search2(int[] nums, int val) {
4545
public static int search3(int[] nums, int val) {
4646
int low = 0, high = nums.length - 1;
4747
while (low <= high) {
48-
int mid = low + ((high - low) >> 1);
48+
int mid = (low + high) >>> 1;
4949
if (nums[mid] < val) {
5050
low = mid + 1;
5151
} else {
@@ -64,7 +64,7 @@ public static int search4(int[] nums, int val) {
6464
int n = nums.length;
6565
int low = 0, high = n - 1;
6666
while (low <= high) {
67-
int mid = low + ((high - low) >> 1);
67+
int mid = (low + high) >>> 1;
6868
if (nums[mid] > val) {
6969
high = mid - 1;
7070
} else {

basic/searching/BinarySearch-II/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static int search(int[] nums, int val) {
2020
int n = nums.length;
2121
int low = 0, high = n - 1;
2222
while (low <= high) {
23-
int mid = low + ((high - low) >> 1);
23+
int mid = (low + high) >>> 1;
2424
if (nums[mid] < val) {
2525
low = mid + 1;
2626
} else if (nums[mid] > val) {
@@ -51,7 +51,7 @@ public static int search(int[] nums, int val) {
5151
int n = nums.length;
5252
int low = 0, high = n - 1;
5353
while (low <= high) {
54-
int mid = low + ((high - low) >> 1);
54+
int mid = (low + high) >>> 1;
5555
if (nums[mid] < val) {
5656
low = mid + 1;
5757
} else if (nums[mid] > val) {
@@ -81,7 +81,7 @@ public static int search(int[] nums, int val) {
8181
public static int search(int[] nums, int val) {
8282
int low = 0, high = nums.length - 1;
8383
while (low <= high) {
84-
int mid = low + ((high - low) >> 1);
84+
int mid = (low + high) >>> 1;
8585
if (nums[mid] < val) {
8686
low = mid + 1;
8787
} else {
@@ -110,7 +110,7 @@ public static int search(int[] nums, int val) {
110110
int n = nums.length;
111111
int low = 0, high = n - 1;
112112
while (low <= high) {
113-
int mid = low + ((high - low) >> 1);
113+
int mid = (low + high) >>> 1;
114114
if (nums[mid] > val) {
115115
high = mid - 1;
116116
} else {

basic/searching/BinarySearch/BinarySearch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ public class BinarySearch {
22

33
private static int search(int[] nums, int low, int high, int val) {
44
while (low <= high) {
5-
int mid = low + ((high -low) >> 1);
5+
int mid = (low + high) >>> 1;
66
if (nums[mid] == val) {
77
return mid;
88
} else if (nums[mid] < val) {
@@ -16,7 +16,7 @@ private static int search(int[] nums, int low, int high, int val) {
1616

1717
private static int searchRecursive(int[] nums, int low, int high, int val) {
1818
while (low <= high) {
19-
int mid = low + ((high - low) >> 1);
19+
int mid = (low + high) >>> 1;
2020
if (nums[mid] == val) {
2121
return mid;
2222
} else if (nums[mid] < val) {

basic/searching/BinarySearch/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ n, n/2, n/4, n/8, ..., n/(2^k)
1717
注意容易出错的 3 个地方。
1818

1919
1. 循环退出条件是 `low <= high`,而不是 `low < high`
20-
1. mid 的取值,可以是 `mid = (low + high) / 2`,但是如果 low 和 high 比较大的话,`low + high` 可能会溢出,所以这里写为 `mid = low + ((high - low) >> 1)`
20+
1. mid 的取值,可以是 `mid = (low + high) / 2`,但是如果 low 和 high 比较大的话,`low + high` 可能会溢出,所以这里写为 `mid = (low + high) >>> 1`
2121
1. low 和 high 的更新分别为 `low = mid + 1``high = mid - 1`
2222

2323
<!-- tabs:start -->
@@ -31,7 +31,7 @@ public class BinarySearch {
3131

3232
private static int search(int[] nums, int low, int high, int val) {
3333
while (low <= high) {
34-
int mid = low + ((high -low) >> 1);
34+
int mid = (low + high) >>> 1;
3535
if (nums[mid] == val) {
3636
return mid;
3737
} else if (nums[mid] < val) {
@@ -71,7 +71,7 @@ public class BinarySearch {
7171

7272
private static int searchRecursive(int[] nums, int low, int high, int val) {
7373
while (low <= high) {
74-
int mid = low + ((high - low) >> 1);
74+
int mid = (low + high) >>> 1;
7575
if (nums[mid] == val) {
7676
return mid;
7777
} else if (nums[mid] < val) {

basic/sorting/MergeSort/MergeSort.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private static void mergeSort(int[] nums, int low, int high, int[] temp) {
2323
if (low >= high) {
2424
return;
2525
}
26-
int mid = low + ((high - low) >> 1);
26+
int mid = (low + high) >>> 1;
2727
mergeSort(nums, low, mid, temp);
2828
mergeSort(nums, mid + 1, high, temp);
2929
merge(nums, low, mid, high, temp);

basic/sorting/MergeSort/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class MergeSort {
3636
if (low >= high) {
3737
return;
3838
}
39-
int mid = low + ((high - low) >> 1);
39+
int mid = (low + high) >>> 1;
4040
mergeSort(nums, low, mid, temp);
4141
mergeSort(nums, mid + 1, high, temp);
4242
merge(nums, low, mid, high, temp);

lcof/面试题11. 旋转数组的最小数字/README.md

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class Solution:
2929
def minArray(self, numbers: List[int]) -> int:
3030
l, r = 0, len(numbers) - 1
3131
while l < r:
32-
m = l + ((r - l) >> 1)
32+
m = (l + r) >> 1
3333
if numbers[m] > numbers[r]:
3434
l = m + 1
3535
elif numbers[m] < numbers[r]:
@@ -46,7 +46,7 @@ class Solution {
4646
public int minArray(int[] numbers) {
4747
int l = 0, r = numbers.length - 1;
4848
while (l < r) {
49-
int m = l + ((r - l) >> 1);
49+
int m = (l + r) >>> 1;
5050
if (numbers[m] > numbers[r]) {
5151
l = m + 1;
5252
} else if (numbers[m] < numbers[r]) {
@@ -68,20 +68,19 @@ class Solution {
6868
* @return {number}
6969
*/
7070
var minArray = function (numbers) {
71-
// return Math.min(...numbers)
72-
let left = 0;
73-
let right = numbers.length - 1;
74-
while (left < right) {
75-
let mid = left + ~~((right - left) / 2);
76-
if (numbers[mid] > numbers[right]) {
77-
left = mid + 1;
78-
} else if (numbers[mid] === numbers[right]) {
79-
right--;
71+
let l = 0,
72+
r = numbers.length - 1;
73+
while (l < r) {
74+
let m = (l + r) >>> 1;
75+
if (numbers[m] > numbers[r]) {
76+
l = m + 1;
77+
} else if (numbers[m] < numbers[r]) {
78+
r = m;
8079
} else {
81-
right = mid;
80+
--r;
8281
}
8382
}
84-
return numbers[left];
83+
return numbers[l];
8584
};
8685
```
8786

@@ -95,7 +94,7 @@ func minArray(nums []int) int {
9594
if nums[mid] > nums[r] {
9695
l = mid + 1
9796
} else if nums[mid] < nums[r] {
98-
r = mid //r 本身不需要被排除
97+
r = mid // r 本身不需要被排除
9998
} else {
10099
r--
101100
}

lcof/面试题11. 旋转数组的最小数字/Solution.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ func minArray(nums []int) int {
55
if nums[mid] > nums[r] {
66
l = mid + 1
77
} else if nums[mid] < nums[r] {
8-
r = mid //r 本身不需要被排除
8+
r = mid // r 本身不需要被排除
99
} else {
1010
r--
1111
}

lcof/面试题11. 旋转数组的最小数字/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class Solution {
22
public int minArray(int[] numbers) {
33
int l = 0, r = numbers.length - 1;
44
while (l < r) {
5-
int m = l + ((r - l) >> 1);
5+
int m = (l + r) >>> 1;
66
if (numbers[m] > numbers[r]) {
77
l = m + 1;
88
} else if (numbers[m] < numbers[r]) {

lcof/面试题11. 旋转数组的最小数字/Solution.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@
33
* @return {number}
44
*/
55
var minArray = function (numbers) {
6-
// return Math.min(...numbers)
7-
let left = 0;
8-
let right = numbers.length - 1;
9-
while (left < right) {
10-
let mid = left + ~~((right - left) / 2);
11-
if (numbers[mid] > numbers[right]) {
12-
left = mid + 1;
13-
} else if (numbers[mid] === numbers[right]) {
14-
right--;
6+
let l = 0,
7+
r = numbers.length - 1;
8+
while (l < r) {
9+
let m = (l + r) >>> 1;
10+
if (numbers[m] > numbers[r]) {
11+
l = m + 1;
12+
} else if (numbers[m] < numbers[r]) {
13+
r = m;
1514
} else {
16-
right = mid;
15+
--r;
1716
}
1817
}
19-
return numbers[left];
18+
return numbers[l];
2019
};

0 commit comments

Comments
 (0)