Permutation
方法一:使用STL的
发布日期:2025-05-02 00:48:13
浏览次数:13
分类:精选文章
本文共 2202 字,大约阅读时间需要 7 分钟。
要解决生成所有可能排列的问题,我们可以使用C++ STL中的next_permutation函数。以下是实现步骤:
方法一:使用STL的next_permutation函数
包含必要的头文件:
- 包含
vector和algorithm头文件。
定义命名空间:
- 在代码中使用
namespace ns {来定义命名空间。
实现next_permutation仿射函数:
- 这个函数接收两个双向迭代器,返回是否能生成下一个排列。
- 递减地找到最后一个元素,检查是否需要交换。
- 如果前一个排列,返回
false。
创建解决方案类:
- 定义一个
Solution类。 - 包含一个
permute方法,该方法接受一个向量作为输入。 - 对输入向量进行排序。
- 初始化一个空结果向量。
- 使用
do-while循环,调用next_permutation函数,直到无法生成下一个排列。 - 每次循环中,将当前排列添加到结果向量中。
主函数:
- 初始化一个向量
v,包含需要排列的数字。 - 创建一个
Solution对象。 - 调用
permute方法,获取所有排列。 - 输出结果。
方法二:递归实现
包含必要的头文件:
- 包含
vector、algorithm和iostream头文件。
定义递归函数:
- 定义一个
dfs递归函数,用于生成所有排列。 - 递归终止条件是当前向量大小等于输入向量大小。
- 对于每个元素,检查是否已经存在于当前向量中,如果不存在,则将其添加到当前向量,并调用递归。
实现permute方法:
- 对输入向量进行排序。
- 初始化一个空结果向量。
- 调用
dfs函数,生成所有排列,并将其添加到结果向量中。
主函数:
- 初始化向量
v,包含需要排列的数字。 - 创建一个
Solution对象。 - 调用
permute方法,获取所有排列。 - 遍历结果向量,输出每个排列。
代码示例
#include#include #include using std::vector;using namespace std;namespace ns { template bool next_permutation(BidirectionalIterator first, BidirectionalIterator last) { if (first == last) return false; BidirectionalIterator i = last; if (--i == first) return false; while (i != first) { auto t = i; --i; if (*i < *t) { auto j = last; while (!(*--j > *i)) ; iter_swap(i, j); reverse(t, last); return true; } } reverse(first, last); return false; } class Solution { public: vector permute(vector & nums) { sort(nums.begin(), nums.end()); vector res; do { res.push_back(nums); } while (next_permutation(nums.begin(), nums.end())); return res; } }; int main() { vector v{1,2,3}; vector res; Solution s; res = s.permute(v); for (int i = 0; i < res.size(); ++i) { for (int j : res[i]) { cout << j; if (!j || j == 3) cout << endl; } } return 0; }}
逐步解释
- next_permutation函数:该函数用于生成一个已经排序序列的下一个排列。如果无法生成下一个排列,返回
false。 - permute方法:首先对输入向量进行排序,然后使用
do-while循环,调用next_permutation函数,生成所有排列,并将每个排列添加到结果向量中。 - 递归实现:使用递归方法,逐步构建每个排列,确保所有可能的排列都被生成。
通过以上方法,可以轻松生成所有可能的排列,满足不同场景的需求。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2026年06月04日 16时37分48秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!