美文网首页
子集、组合、排列算法

子集、组合、排列算法

作者: splendor2000 | 来源:发表于2017-01-08 23:30 被阅读0次

列出所有 1...n 的子集
from pprint import pprint as print

def subsets(n):
    assert(n >= 0)
    s = []
    r = []

    def h(n):
        if n == 0:
            r.append(s[:])
        else:
            s.append(n)
            h(n - 1)
            del s[-1]
            h(n - 1)

    h(n)
    return r

print(subsets(3))

输出

[[3, 2, 1], [3, 2], [3, 1], [3], [2, 1], [2], [1], []]

从 1...n 选 m 个数,列出所有组合
from pprint import pprint as print

def combinations(n, m):
    assert(n >= 0 and m >= 0)
    c = []
    r = []

    def h(n, m):
        if n >= m:
            if m == 0:
                r.append(c[:])
            else:
                c.append(n)
                h(n - 1, m - 1)
                del c[-1]
                h(n - 1, m)

    h(n, m)
    return r

print(combinations(5, 3))

输出

[[5, 4, 3],
 [5, 4, 2],
 [5, 4, 1],
 [5, 3, 2],
 [5, 3, 1],
 [5, 2, 1],
 [4, 3, 2],
 [4, 3, 1],
 [4, 2, 1],
 [3, 2, 1]]

从 1...n 选 m 个数,列出所有排列
from pprint import pprint as print

def permutations(n, m):
    assert(n >= 0 and m >= 0)
    p = []
    r = []

    def h(n, m):
        if m == 0:
            r.append(p[:])
        else:
            for i in range(1, n + 1):
                if not i in p:
                    p.append(i)
                    h(n, m - 1)
                    del p[-1]

    h(n, m)
    return r

print(permutations(5, 2))

输出

[[1, 2],
 [1, 3],
 [1, 4],
 [1, 5],
 [2, 1],
 [2, 3],
 [2, 4],
 [2, 5],
 [3, 1],
 [3, 2],
 [3, 4],
 [3, 5],
 [4, 1],
 [4, 2],
 [4, 3],
 [4, 5],
 [5, 1],
 [5, 2],
 [5, 3],
 [5, 4]]

相关文章

  • 子集、组合、排列算法

    列出所有 1...n 的子集 输出 从 1...n 选 m 个数,列出所有组合 输出 从 1...n 选 m 个数...

  • 算法题中的子集,排列,组合

    子集 例:[1,2,3] 的所有子集结果 [],[1],[1,2],[1,2,3],[1,3],[2],[2,3...

  • 排列,组合,子集专题

    排列组合的题用回溯法和递归基本可以解决,总结一下。46.全排列 47.全排列II 47比46多了个序列可重复的条件...

  • 回溯算法团灭子集、排列、组合问题

    读完本文,你可以去力扣拿下如下题目: 78.子集[https://leetcode-cn.com/problems...

  • 排列组合-js

    排列组合 数学相关知识:5分钟彻底了解排列组合 参考:程序员必备算法——排列组合 排列有序,组合无序 3选2 :排...

  • 搜索(二)回溯

    一、题目总结 基础问题 46.全排列 77.组合 78.子集 39.组合求和 47.全排列 II(重复元素) 90...

  • 算法实际应用集(上)

    使用笛卡尔算法进行sku组合 需求 对商品规格进行排列组合,电商的sku商品组合 功能截图,对商品规格进行组合排列...

  • 46. Permutations

    算法 1: 递归数组 的全排列,等价于全排列与可能的取值组合得到。 算法 2: 计算一个排列 按字典升序排列的紧...

  • 求子集

    利用递归的方法求子集 每层递归是不同的排列组合,因为前面的数已经排列组合过了,每次只需要从下一个数开始组合即可 c...

  • 数字子集的排列组合问题

    Combinations https://leetcode.com/problems/combinations/给...

网友评论

      本文标题:子集、组合、排列算法

      本文链接:https://www.haomeiwen.com/subject/xmscbttx.html