全排列
全排列
1. next_permutation函数
-
基本概念:全排列是指长度为n的数列a1,a2,...,an所有可能的排列组合,共有n!种排列方式。
-
功能说明
-
按照字典序生成当前序列的下一个排列
-
若存在下一个排列,修改当前序列并返回true
-
若已是最后一个排列,将序列重置为第一个排列并返回false
-
-
字典序规则:从前向后比较,第一个不相同的位置决定大小关系(如ABC的下一个是ACB)
-
使用要求:若要生成完整全排列,初始序列必须是最小字典序排列(如{1,2,3})
-
代码示例:
vector<int> nums = {1,2,3};
while(next_permutation(nums.begin(), nums.end())){
// 输出每个排列
}
2. prev_permutation函数
-
功能对比:与next_permutation相反,生成当前序列的上一个排列
-
工作逻辑
-
存在上一个排列时修改序列并返回true
-
已是第一个排列时重置为最后一个排列并返回false
-
-
使用要求:初始序列需为最大字典序排列(如{3,2,1})
-
典型应用:两种函数都可替代DFS实现全排列枚举,代码更简洁
3. 例题: next_permutation函数应用
-
实现要点
-
使用数组或vector存储序列(示例使用int a[10])
-
循环条件通过bool tag控制,初始设为true保证首次执行
-
tag=next_permutation(a+1,a+1+4);
-
参数传递区间地址(数组用a+1, a+1+4)
-
-
特殊现象
-
从中间状态开始生成时(如{2,3,4,1}),仍会遍历到字典序终点
-
到达终点后函数会将序列重置为最小排列(如{4,3,2,1}→{1,2,3,4})
-
-
注意事项
-
函数名拼写需准确(常见错误如next_pernutation)
-
区间参数范围要正确包含所有元素
-
输出时注意处理末尾空格和换行
-

浙公网安备 33010602011771号