线段数组互相覆盖问题-算法题

线段数据互相覆盖问题-算法题

"""
    线段数组覆盖的问题
    a-[[1,3] [2,6]]
    b-[[1,4],[4,5]]
    a数组中,可以得到[1,6]区间,可以覆盖b数组中所有线段
    a-[[1,2],[4,7]]
    b-[[2,5],[6,7]]
    a数组就不能覆盖b数组中的[2,5]

    #############
    对a b分别进行线段合并
    如上例中 a-合并得到[[1,6]]可以覆盖b-[[1,5]]
    a-[[1,2],[4,7]] b-[2,7]不能覆盖

    合并a,b之后,顺序按照单位的去比较
    """

    def merge(a):
        """
        建一个足够大的数组,线段区间在内就为1
        """
        start,end = 1e9,-1e9
        for x in a:
            if x[0]0]
            if x[1]>end:
                end = x[1]
        leng = end - start+1
        array = [0 for i in range(leng)]
        for y in a:
            for x in range(y[0],y[1]+1):
                array[x-start]=1
        # 一次遍历得到数组中为1的为覆盖情况
        return array, start, end

    def solution(a, b):
        a_array, a_start, a_end = merge(a)
        b_array, b_start, b_end = merge(b)
        print(a,a_array)
        print(b,b_array)
        # 逐个单位进行比较,判断a是否能覆盖b
        if b_startor b_end>a_end: return False
        for i in range(b_start, b_end+1):
            if b_array[i-b_start]==1:
                if a_array[i-a_start]==0: return False
        return True

    def main():
        a = [[1,3],[2,6]]
        b = [[1,4],[4,5]]
        print(solution(a,b))
        a = [[1,2],[4,7]]
        b = [[2,5],[6,7]]
        print(solution(a,b))

    main()

    """
    [[1, 3], [2, 6]] [1, 1, 1, 1, 1, 1]
    [[1, 4], [4, 5]] [1, 1, 1, 1, 1]
    True
    [[1, 2], [4, 7]] [1, 1, 0, 1, 1, 1, 1]
    [[2, 5], [6, 7]] [1, 1, 1, 1, 1, 1]
    False
    """

你可能感兴趣的:(python,算法)