Google Interview: Arrangement of Blocks

前端 未结 5 2115
终归单人心
终归单人心 2020-12-22 17:23

You are given N blocks of height 1…N. In how many ways can you arrange these blocks in a row such that when viewed from left you see only L blocks (rest are hidden by taller

5条回答
  •  时光取名叫无心
    2020-12-22 17:50

    Here is my construction solution inspired by @PengOne's ideas.

    import itertools
    
    def f(blocks, m):
        n = len(blocks)
        if m > n:
            return []
        if m < 0:
            return []
        if n == m:
            return [sorted(blocks)]
        maximum = max(blocks)
        blocks = list(set(blocks) - set([maximum]))
        results = []
        for k in range(0, n):
            for left_set in itertools.combinations(blocks, k):
                for left in f(left_set, m - 1):
                    rights = itertools.permutations(list(set(blocks) - set(left)))
                    for right in rights:
                        results.append(list(left) + [maximum] + list(right))
        return results
    
    def b(n, l, r):
        blocks = range(1, n + 1)
        results = []
        maximum = max(blocks)
        blocks = list(set(blocks) - set([maximum]))
        for k in range(0, n):
            for left_set in itertools.combinations(blocks, k):
                for left in f(left_set, l - 1):
                    other = list(set(blocks) - set(left))
                    rights = f(other, r - 1)
                    for right in rights:
                        results.append(list(left) + [maximum] + list(right))
        return results
    
    # Sample
    print b(4, 3, 2) # -> [[1, 2, 4, 3], [1, 3, 4, 2], [2, 3, 4, 1]]
    

提交回复
热议问题