You have k lists of sorted integers. Find the smallest range that includes at least one number from each of the k lists.
For example,
List 1: [4, 10, 15, 24, 26]
List 2: [0, 9, 12, 20]
List 3: [5, 18, 22, 30]
The smallest range here would be [20, 24] as it contains 24 from list 1, 20 from list 2, and 22 from list 3.
Solution:
There are k lists of sorted integers. Make a min heap of size k containing 1 element from each list. Keep track of min and max element and calculate the range.
In min heap, minimum element is at top. Delete the minimum element and another element instead of that from the same list to which minimum element belong. Repeat the process till any one of the k list gets empty.
Keep track of minimum range.
For eg.
List 1: [4, 10, 15, 24, 26]
List 2: [0, 9, 12, 20]
List 3: [5, 18, 22, 30]
Min heap of size 3. containing 1 element of each list
Heap [0, 4, 5]
Range - 5
Remove 0 and add 9
Heap [4, 9, 5]
Range - 5
Remove 4 and add 10
Heap [5, 9, 10]
Range - 5
and so on....
Finally you will yield the result.
Python Version codes:
import heapq
def max_range(input):
#Assume every arr in input is not empty
h, lenArr = [], []
min_val, max_val = input[0][0],input[0][0]
for i in range(len(input)):
h.append((input[i][0], (i, 0))) #(value, (list index, item index))
lenArr.append(len(input[i]))
if (input[i][0] > max_val):
max_val = input[i][0]
heapq.heapify(h)
while (True):
top_val = heapq.heappop(h)
min_val = top_val[0]
min_interval, min_interval_lower, min_interval_upper = max_val - min_val, min_val, max_val
if (max_val - min_val < min_interval):
min_interval, min_interval_lower, min_interval_upper = max_val - min_val, min_val, max_val
list_index , item_index = top_val[1][0], top_val[1][1]
if (item_index + 1 < lenArr[list_index]):
heapq.heappush(h, (input[list_index][item_index+1], (list_index, item_index+1)))
max_val = input[list_index][item_index+1] if input[list_index][item_index+1] > max_val else max_val
else:
break
return [min_interval_lower, min_interval_upper]
if __name__ == '__main__':
input = [[4, 10, 15, 24, 26], [0, 9, 12, 20], [5, 18, 22, 30]]
min_interval = max_range(input)
print(min_interval)