无序列表找出所有间隔为d的组合
无序列表找出所有间隔为d的组合
已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来。
我的思路: 排序列表,得到一个每个元素加上间隔的新列表,最后使用二分查找。时间复杂度nlogn
python代码:
""""
已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来
"""
# def find_interval(value_list, interval):
# out_list = []
# for value in value_list:
# if (value + interval) in value_list:
# out_list.append((value, value + interval))
# return out_list
def bisect_find(li, target, start, end):
if start > end:
return False
mid = (start + end)//2
if li[mid] > target:
return bisect_find(li, target, start, mid-1)
elif li[mid] < target:
return bisect_find(li, target, mid+1, end)
else:
return True
def binary_find(li, target):
start = 0
end = len(li) - 1
while start <= end:
mid = (start + end) // 2
if li[mid] == target:
return True
elif li[mid] > target:
end = mid - 1
else:
start = mid + 1
else:
return False
def find_interval(value_list, interval):
out_list = []
sort_list = sorted(value_list)
deal_list = list(map(lambda x: x + interval, sort_list))
for i in sort_list:
# find = bisect_find(deal_list, i, 0, len(deal_list) - 1)
find = binary_find(deal_list, i)
if find:
out_list.append((i, i + interval))
return out_list
if __name__ == '__main__':
value_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
1213, 12, 31, 2, 13, 21, 21, 221, 11, 10]
res = find_interval(value_list, 2)
print(res)

浙公网安备 33010602011771号