【问题标题】:Combination up to n组合最多 n
【发布时间】:2014-03-30 20:23:19
【问题描述】:

给定一个数组a,实现其组合直到n-th 的最佳方法是什么?例如:

a = %i[a b c]
n = 2

# Expected => [[], [:a], [:b], [:c], [:a, b], [:b, :c], [:c, :a]]

【问题讨论】:

标签: ruby arrays combinations


【解决方案1】:

如下操作:

a = %w[a b c]
n = 3

0.upto(n).flat_map { |i| a.combination(i).to_a }
# => [[], ["a"], ["b"], ["c"], ["a", "b"], 
# ["a", "c"], ["b", "c"], ["a", "b", "c"]]

【讨论】:

    【解决方案2】:

    另一种方式:

    def all_combis(a, n, b=[])
      n.zero? ? b.unshift([]) : all_combis(a, n-1, b.unshift(*a.combination(n)))
    end
    
    all_combis(%i[a b c], 0)
      #=> [[]]
    all_combis(%i[a b c], 1)
      #=> [[], [:a], [:b], [:c]]
    all_combis(%i[a b c], 2)
      #=> [[], [:a], [:b], [:c], [:a, :b], [:a, :c], [:b, :c]]
    all_combis(%i[a b c], 3)
      #=> [[], [:a], [:b], [:c], [:a, :b], [:a, :c], [:b, :c], [:a, :b, :c]]
    

    如果秩序和效率不重要,这也有效:

    a.repeated_combination(n).map(&:uniq) << []
    
    %i[a b c].repeated_combination(2).map(&:uniq) << []
      #=> [[:a], [:a, :b], [:a, :c], [:b], [:b, :c], [:c], []]
    

    【讨论】:

    • +1 帮助我记住repeated_combination.. 递归技术也不错。
    猜你喜欢
    • 2015-01-16
    • 2013-08-23
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2015-05-18
    相关资源
    最近更新 更多