【问题标题】:C++ next_permutation without listing in reverse orderC++ next_permutation 不按相反顺序列出
【发布时间】:2015-12-02 00:16:19
【问题描述】:

有没有办法打印所有的排列,通过在 C++ 中使用 next_permutation 来忽略已经以相反顺序出现的排列。例如,在它打印{1, 2, 3, 4} 之后,它不应该打印{4, 3, 2, 1}。

【问题讨论】:

  • 我不确定我是否理解您的问题。 1,2,3,4 是第一个字典排列,如果你使用next_permutation,它将打印1,2,4,3,而不是4,3,2,1。也许您要combinations?
  • 虽然对于 Python,this question 上的答案提供了一些很好的解释。

标签: c++ permutation


【解决方案1】:

只要排列中的第一个元素按字典顺序小于最后一个元素,就不会得到任何反转时重复的排列:

std::vector<int> v {1, 2, 3, 4};

do {
    if (v.front() < v.back()) { // first less than last
        std::copy(v.begin(), v.end(),
                  std::ostream_iterator<int>(std::cout, " "));
        cout << '\n';
    }
}
while (std::next_permutation(v.begin(), v.end()));

【讨论】:

    【解决方案2】:

    当您按递增顺序生成排列时,您可以简单地忽略最后一项小于其第一项的任何排列(其反向已列出)。

    由于n个项目的排列数是n!,消除一半不会影响big-O性能。

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 2020-03-29
      • 1970-01-01
      • 2012-01-09
      相关资源
      最近更新 更多