C ++ next_permutation没有以相反的顺序列出

时间:2015-09-06 08:56:38

标签: c++ permutation

有没有办法打印所有排列,省略在C ++中使用next_permutation以相反顺序发生的排列。例如,在打印{1, 2, 3, 4}后,它不应该打印{4, 3, 2, 1}

2 个答案:

答案 0 :(得分:2)

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

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()));

答案 1 :(得分:0)

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

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