C++编程笔记之next_permutation
来源:互联网 发布:java replace first 编辑:程序博客网 时间:2024/06/13 22:49
STL中的next_permutation是得到序列的下一个全排列序列。
1、next_permutation
首先,从右至左找到第一个左边值n[i]小于右边值n[i+1];
然后,从右搜索第一个大于n[i]的值n[j],将n[i]与n[j]互换;
最后,将n[i+1]之后的全部reverse。
template <class _BidirectionalIter>bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) { __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator); __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type, _LessThanComparable); if (__first == __last)//没有元素,直接返回false return false; _BidirectionalIter __i = __first; ++__i; if (__i == __last)//如果只有一个元素,也返回false return false; __i = __last; --__i; for(;;) { _BidirectionalIter __ii = __i;//从右至左第一个元素 --__i;//从右至左第二个元素 if (*__i < *__ii) {//如果找到第一个左边元素小于右边的时候 _BidirectionalIter __j = __last; while (!(*__i < *--__j))//从右边搜索,找到第一个大于i所对应的元素 {} iter_swap(__i, __j);//交换i,j reverse(__ii, __last);//i+1包括i+1之后的元素reverse。 return true; } if (__i == __first) {//如果当前的序列已经是最后一个序列,直接reverse reverse(__first, __last); return false; } }}
pre_permutation则刚好相反,只需要把比较关系反转即可。
由于字典序是完全按照大小进行排列的,所以就算有重复的元素,仍然是相同的序列。
2、使用next_permutation实现有重复的全排列
#include<iostream>#include<algorithm>using namespace std;int main(){ int ans[4]={1,2,2,4}; do { for(int i=0;i<4;++i) cout<<ans[i]<<" "; cout<<endl; }while(next_permutation(ans,ans+4)); return 0;}
结果:
3、递归实现全排列
#include<vector>#include<iostream>void swap(int& x, int& y){ int tmp = x; x = y; y = tmp;}void permutation(vector<int> nums, int i){ int len = nums.size(); if (i == len){ for(i = 0;i < len;i++){ cout<<nums[i]<<' '; } cout<<'\n'; return; } else{ for (int j = i; j < len; j++){ if(nums[i] == nums[j] && j != i)continue; swap(nums[i], nums[j]); permutation(nums, i+1); swap(nums[i], nums[j]); } }};int main(){ vector<int> nums={1,2,2,4}; solution result; result.permutation(nums,0);}
阅读全文
0 0
- C++编程笔记之next_permutation
- STL学习笔记之next_permutation(下一个排列)
- C++STL的next_permutation
- C++STL的next_permutation
- C++STL的next_permutation
- [C++]next_permutation()函数解析
- Linux+C学习笔记之IO编程
- Linux+C学习笔记之网络编程
- 《c语言编程之道》笔记
- 《c语言编程之道》笔记
- C指针编程之道 ---第一次笔记
- C指针编程之道 ---第二次笔记
- C指针编程之道 ---第三次笔记
- C指针编程之道--------笔记
- STL之 next_permutation
- C++之next_permutation
- C语言学习笔记之C语言编程
- [POJ1833] 排列(STL之next_permutation)
- LeetCode题目:343. Integer Break
- 5-1 求最大值及其下标 (20分)
- 操作系统复习-1.2操作系统的发展与分类
- Linux下如何用GDB调试c++程序 [版本2]
- 半直接法视觉里程计(SVO)实践
- C++编程笔记之next_permutation
- x86架构——常用的IO端口
- JS继承--寄生组合式继承
- 《JavaScript DOM编程艺术 第2版》——读书笔记(不含代码部分)
- git基本使用
- [leetcode]: 326. Power of Three
- B2C网站系统框架
- 2017 计蒜之道 初赛 第一场 A.阿里的新游戏
- 程序员面试金典——洪水