CareerCup Find the smallest range that includes at least one number from each of the k sorted lists.

265 篇文章 1 订阅
86 篇文章 0 订阅

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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值