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

+4-4
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

+4-4
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

+2-2
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

+3-3
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

+1-1
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

+1-1
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

+13-14
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

+1-1
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

+1-1
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

+10-11
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
};

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class Solution:
22
def minArray(self, numbers: List[int]) -> int:
33
l, r = 0, len(numbers) - 1
44
while l < r:
5-
m = l + ((r - l) >> 1)
5+
m = (l + r) >> 1
66
if numbers[m] > numbers[r]:
77
l = m + 1
88
elif numbers[m] < numbers[r]:

lcof/面试题51. 数组中的逆序对/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class Solution {
8989
if (s == e) {
9090
return;
9191
}
92-
int mid = s + ((e - s) >> 1);
92+
int mid = (s + e) >>> 1;
9393
mergeSort(nums, s, mid);
9494
mergeSort(nums, mid + 1, e);
9595
merge(nums, s, mid, e);

lcof/面试题51. 数组中的逆序对/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private void mergeSort(int[] nums, int s, int e) {
1313
if (s == e) {
1414
return;
1515
}
16-
int mid = s + ((e - s) >> 1);
16+
int mid = (s + e) >>> 1;
1717
mergeSort(nums, s, mid);
1818
mergeSort(nums, mid + 1, e);
1919
merge(nums, s, mid, e);

lcof/面试题53 - I. 在排序数组中查找数字 I/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Solution:
3535
return 0
3636
l, r = 0, len(nums) - 1
3737
while l <= r:
38-
m = l + ((r - l) >> 1)
38+
m = (l + r) >> 1
3939
if nums[m] == target:
4040
return self._count(nums, l, r, m)
4141
if nums[m] < target:
@@ -70,7 +70,7 @@ class Solution {
7070
}
7171
int l = 0, r = nums.length - 1;
7272
while (l <= r) {
73-
int m = l + ((r - l) >> 1);
73+
int m = (l + r) >>> 1;
7474
if (nums[m] == target) {
7575
return count(nums, l, r, m);
7676
}

lcof/面试题53 - I. 在排序数组中查找数字 I/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public int search(int[] nums, int target) {
55
}
66
int l = 0, r = nums.length - 1;
77
while (l <= r) {
8-
int m = l + ((r - l) >> 1);
8+
int m = (l + r) >>> 1;
99
if (nums[m] == target) {
1010
return count(nums, l, r, m);
1111
}

lcof/面试题53 - I. 在排序数组中查找数字 I/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ def search(self, nums: List[int], target: int) -> int:
44
return 0
55
l, r = 0, len(nums) - 1
66
while l <= r:
7-
m = l + ((r - l) >> 1)
7+
m = (l + r) >> 1
88
if nums[m] == target:
99
return self._count(nums, l, r, m)
1010
if nums[m] < target:

lcof/面试题53 - II. 0~n-1中缺失的数字/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Solution:
3939
if nums[r] == r:
4040
return r + 1
4141
while r - l > 1:
42-
m = l + ((r - l) >> 1)
42+
m = (l + r) >> 1
4343
if nums[m] == m:
4444
l = m
4545
else:
@@ -60,7 +60,7 @@ class Solution {
6060
return r + 1;
6161
}
6262
while (r - l > 1) {
63-
int m = l + ((r - l) >> 1);
63+
int m = (l + r) >>> 1;
6464
if (nums[m] == m) {
6565
l = m;
6666
} else {

lcof/面试题53 - II. 0~n-1中缺失的数字/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public int missingNumber(int[] nums) {
88
return r + 1;
99
}
1010
while (r - l > 1) {
11-
int m = l + ((r - l) >> 1);
11+
int m = (l + r) >>> 1;
1212
if (nums[m] == m) {
1313
l = m;
1414
} else {

lcof/面试题53 - II. 0~n-1中缺失的数字/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ def missingNumber(self, nums: List[int]) -> int:
66
if nums[r] == r:
77
return r + 1
88
while r - l > 1:
9-
m = l + ((r - l) >> 1)
9+
m = (l + r) >> 1
1010
if nums[m] == m:
1111
l = m
1212
else:

solution/0000-0099/0033.Search in Rotated Sorted Array/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ public int search(int[] A, int target) {
33
if (A == null || A.length == 0) return -1;
44
int low = 0,high = A.length - 1;
55
while (low <= high) {
6-
int mid = low + ((high - low) >> 1);
6+
int mid = (low + high) >>> 1;
77
if (target < A[mid]) {
88
if (A[mid] >= A[high] && target < A[low]) low = mid + 1;
99
else high = mid - 1;

solution/0000-0099/0035.Search Insert Position/README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class Solution:
5050
def searchInsert(self, nums: List[int], target: int) -> int:
5151
l, h = 0, len(nums) - 1
5252
while l <= h:
53-
m = l + ((h - l) >> 1)
53+
m = (l + h) >> 1
5454
if nums[m] == target:
5555
return m
5656
if nums[m] < target:
@@ -69,7 +69,7 @@ class Solution {
6969
public int searchInsert(int[] nums, int target) {
7070
int l = 0, h = nums.length - 1;
7171
while (l <= h) {
72-
int m = l + ((h - l) >> 1);
72+
int m = (l + h) >>> 1;
7373
if (nums[m] == target) return m;
7474
if (nums[m] < target) l = m + 1;
7575
else h = m - 1;
@@ -129,7 +129,7 @@ var searchInsert = function (nums, target) {
129129
let l = 0,
130130
h = nums.length;
131131
while (l <= h) {
132-
const m = l + ((h - l) >> 1);
132+
const m = (l + h) >>> 1;
133133
if (nums[m] == target) return m;
134134
if (nums[m] < target) l = m + 1;
135135
else h = m - 1;

0 commit comments

Comments
 (0)