Permutation Sequence
2015-11-03 14:11
423 查看
class Solution { public: int num=0; bool isgo=true; public: string getPermutation(int n, int k) { vector<int> nums; for(int i=1;i<=n;++i) nums.push_back(i); vector<vector<int>> res; vector<int> path; string str; trackback(res,path,nums,k,str); return str; } void trackback(vector<vector<int>> &res,vector<int> &path,vector<int> &nums,int k,string &str) { if(path.size() == nums.size()) { res.push_back(path); num++; if(num == k) { for(auto c:path) { str+=char(c+48); } isgo=false; } return ; } if(!isgo)//强制递归停止,层层返回 return ; for(auto i:nums) { auto pos=find(path.begin(),path.end(),i); if(pos==path.end()) { path.push_back(i); trackback(res,path,nums,k,str); path.pop_back(); } } } };
但是这个方法超时
康托逆展开编辑
例1 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕(1)找出第96个数
首先用96-1得到95
用95去除4! 得到3余23
有3个数比它小的数是4
所以第一位是4
用23去除3! 得到3余5
有3个数比它小的数是4但4已经在之前出现过了所以第二位是5(4在之前出现过,所以实际比5小的数是3个)
用5去除2!得到2余1
有2个数比它小的数是3,第三位是3
用1去除1!得到1余0
有1个数比它小的数是2,第二位是2
最后一个数只能是1
所以这个数是45321
class Solution { public: string getPermutation(int n, int k) { int tbl[]= { 1,2,6,24,120,720,5040,40320,362880 }; if( k > tbl[n-1] ) return ""; vector<int> used { 1,2,3,4,5,6,7,8,9 }; string s(n, '0'); int i=n-1, j=0, o, u; while( j < n ) { o = ( i == 0 ? 0 : (k-1)/tbl[i-1]); u = used[o]; s[j++] = u + '0'; used.erase(used.begin() + o); k = k - o*tbl[(i--)-1]; } return s; } };
看了这个高手的代码,真的是心情愉悦,还有更精简的吗?
相关文章推荐
- 优化编译环境Optimizing a build environment (optional)
- Android编译准备Establishing a Build Environment
- UIButton拖动响应事件,距离问题
- IOS开发之 ---- iOS8中提示框的使用UIAlertController(UIAlertView和UIActionSheet二合一)
- iOS9 系统分享调用(UIActivityViewController)
- iOS9 系统分享调用(UIActivityViewController)
- JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
- 黑马程序员—— Foundation框架NSArray、NSSet、NSDictionary、NSNumber、NSDate、NSValue
- UITableView的简单使用!
- Android:开源框架xutils介绍之 ViewUtils(注解实现UI绑定和事件绑定)
- 20135223/20135234/20135229小组——亚博 Arduino智能小车实践报告
- UITabBarController使用总结
- xcode build setting说明
- JDBC:DAO(三)利用queryRunner实现一个较好的DAO架构
- iOS8中提示框的使用UIAlertController(UIAlertView和UIActionSheet二合一)
- UITextField监听文字输入事件
- mosquitto 桥接环境
- iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)
- UINavigationItem的那点事
- 解决Azure Management API ForbiddenError: The server failed to authenticate the request