Given an ordered integer list, return the largest integer less than N and smallest integer greater than N. If there is none for one, just print “X”.
Advertisement
Answer
As far as I know, this is the fastest solution possible.
JavaScript
x
41
41
1
def binary_search(arr, x):
2
low = 0
3
high = len(arr) - 1
4
mid = 0
5
lm = -1
6
while low <= high:
7
lm = mid
8
mid = (high + low) // 2
9
if arr[mid] < x:
10
low = mid + 1
11
elif arr[mid] > x:
12
high = mid - 1
13
else:
14
return mid
15
if lm == mid:break
16
return mid
17
18
def find_next_bigger(arr,n,i):
19
while i < len(arr):
20
if arr[i] > n:
21
return arr[i]
22
i += 1
23
return arr[i] if i < len(arr) else "X"
24
25
def find_next_smaller(arr, n,i):
26
while i >= 0:
27
if arr[i] < n:
28
return arr[i]
29
i -= 1
30
return arr[i] if i > 0 else "X"
31
32
def solution(arr, n):
33
if n > arr[-1]:
34
return arr[-1], "X"
35
if arr[0] > n:
36
return "X", arr[0]
37
i = binary_search(arr, n)
38
bigger = find_next_bigger(arr, n, i)
39
smaller = find_next_smaller(arr,n,i)
40
return smaller, bigger
41