Efficient way to find missing elements in an integer sequence

前端 未结 16 1362
鱼传尺愫
鱼传尺愫 2020-12-01 04:32

Suppose we have two items missing in a sequence of consecutive integers and the missing elements lie between the first and last elements. I did write a code that does accomp

16条回答
  •  爱一瞬间的悲伤
    2020-12-01 05:13

    Assuming that L is a list of integers with no duplicates, you can infer that the part of the list between start and index is completely consecutive if and only if L[index] == L[start] + (index - start) and similarly with index and end is completely consecutive if and only if L[index] == L[end] - (end - index). This combined with splitting the list into two recursively gives a sublinear solution.

    # python 3.3 and up, in older versions, replace "yield from" with yield loop
    
    def missing_elements(L, start, end):
        if end - start <= 1: 
            if L[end] - L[start] > 1:
                yield from range(L[start] + 1, L[end])
            return
    
        index = start + (end - start) // 2
    
        # is the lower half consecutive?
        consecutive_low =  L[index] == L[start] + (index - start)
        if not consecutive_low:
            yield from missing_elements(L, start, index)
    
        # is the upper part consecutive?
        consecutive_high =  L[index] == L[end] - (end - index)
        if not consecutive_high:
            yield from missing_elements(L, index, end)
    
    def main():
        L = [10,11,13,14,15,16,17,18,20]
        print(list(missing_elements(L,0,len(L)-1)))
        L = range(10, 21)
        print(list(missing_elements(L,0,len(L)-1)))
    
    main()
    

提交回复
热议问题