1+ """
2+ Author: Wenru
3+ """
4+
5+ from typing import List
6+
7+ def bsearch_left (nums : List [int ], target : int ) -> int :
8+ """Binary search of the index of the first element
9+ equal to a given target in the ascending sorted array.
10+ If not found, return -1.
11+ """
12+ low , high = 0 , len (nums ) - 1
13+ while low <= high :
14+ mid = low + (high - low ) // 2
15+ if nums [mid ] < target :
16+ low = mid + 1
17+ else :
18+ high = mid - 1
19+ return low if nums [low ] == target else - 1
20+
21+ def bsearch_right (nums : List [int ], target : int ) -> int :
22+ """Binary search of the index of the last element
23+ equal to a given target in the ascending sorted array.
24+ If not found, return -1.
25+ """
26+ low , high = 0 , len (nums ) - 1
27+ while low <= high :
28+ mid = low + (high - low ) // 2
29+ if nums [mid ] <= target :
30+ low = mid + 1
31+ else :
32+ high = mid - 1
33+ return high if nums [high ] == target else - 1
34+
35+
36+ def bsearch_left_not_less (nums : List [int ], target : int ) -> int :
37+ """Binary search of the index of the first element
38+ not less than a given target in the ascending sorted array.
39+ If not found, return -1.
40+ """
41+ low , high = 0 , len (nums ) - 1
42+ while low <= high :
43+ mid = low + (high - low ) // 2
44+ if nums [mid ] < target :
45+ low = mid + 1
46+ else :
47+ high = mid - 1
48+ return low if low < len (nums ) else - 1
49+
50+ def bsearch_right_not_greater (nums : List [int ], target : int ) -> int :
51+ """Binary search of the index of the last element
52+ not greater than a given target in the ascending sorted array.
53+ If not found, return -1.
54+ """
55+ low , high = 0 , len (nums ) - 1
56+ while low <= high :
57+ mid = low + (high - low ) // 2
58+ if nums [mid ] <= target :
59+ low = mid + 1
60+ else :
61+ high = mid - 1
62+ return high if high > 0 else - 1
63+
64+ if __name__ == "__main__" :
65+ import bisect
66+
67+ a = [0 , 1 , 1 , 2 , 3 , 4 , 5 , 6 , 6 , 7 , 8 , 8 , 10 , 10 , 10 ]
68+ b = [11 , 12 , 12 , 13 , 14 , 14 , 15 , 15 ]
69+ print (bisect .bisect_left (a , 10 ) == bsearch_left (a , 10 ))
70+ print (bisect .bisect_right (a , 10 ))
71+ print (bisect .bisect_right (a , 6 )- 1 == bsearch_right (a , 6 ))
72+ print (bisect .bisect_right (b , 14 )- 1 == bsearch_right (b , 14 ))
73+
74+ print (bsearch_left_not_less (a , 11 ))
75+ print (bsearch_right_not_greater (b , 12 ))
76+ print (bsearch_right_not_greater (b , 10 ))
77+ print (bsearch_right_not_greater (b , 17 ))
0 commit comments