leetcode4:Permutation
2015-09-20 15:46
309 查看
#include <utility> #include <iostream> #include <vector> #include <algorithm> //the next permutation template<class BidirIt> bool STL_next_permutation(BidirIt first, BidirIt last) { if (first == last) return false; BidirIt i = last; if (first == --i) return false; while (1) { BidirIt i1, i2; i1 = i; --i; if (*i < *i1) { i2 = last; while (!(*i < *--i2)) ; std::iter_swap(i, i2); std::reverse(i1, last); return true; } if (i == first) { std::reverse(first, last); return false; } } } void nextPermutation(int A[],int len) { STL_next_permutation(A, A+len); } //full pemutation void fullPerm(int A[],int m,int n) { if(m == n) { for(int i=0;i<n+1;i++) std::cout << A[i] << " "; std::cout << std::endl; return; } else { for(int i=m;i<n+1;i++) { std::swap(A[m], A[i]); fullPerm(A,m+1,n); std::swap(A[m], A[i]); } } } int Factorial(int n) { int fac=1; for(int i=1;i<=n;i++) { fac *=i; } return fac; } //康托编码第k个序列 void CantorCode(int A[],int len,int k) { --k; std::vector<std::pair<int,bool>> v; for(int i=0;i<len;i++) { v.emplace_back(A[i],false); } for(int i=0;i<len;i++) { int j; int t=k/Factorial(len-i-1); for(j=0;j<len;j++) { if(!v[j].second) { if(t==0) break; --t; } } A[i]=v[j].first; v[j].second=true; k=k%Factorial(len-i-1); } }
相关文章推荐
- poj 2186 Popular Cows【tarjan求scc个数&&缩点】【求一个图中可以到达其余所有任意点的点的个数】
- HDU_5459 Jesus Is Here(递推)
- 【VMCloud云平台】私有云门户WAP初始配置
- 为什么我的mysql数据库里的表只有frm文件
- Linux用户空间与内核空间
- int * * a[10] int * (*a)[10]和 int(*a[10])() 是什么意思
- C#运算符、控制流
- 2015.9.20
- linux 基本文件管理命令
- 研磨数据结构与算法-10二叉树的基本概念
- C#运算符、控制流
- 用NetBeans制作表格并实现增删改功能
- Android应用开发Camera系列(一):SurfaceView实现相机预览demo--新手上路
- Android Studio JNI NDK编程(一)
- 安卓著名博客
- hdoj 1016 Prime Ring Problem【素数环】
- java编程规范大全
- int (*a)[10] 和 int *a[10] 的区别
- 数制转换及原码补码反码问题
- java编程规范大全