无序列表找出所有间隔为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)

posted @ 2019-04-22 16:35  村口王铁匠  阅读(487)  评论(0)    收藏  举报