LC60 Permutation Sequence
2016-04-02 19:15
399 查看
这道题目有两种做法,第一种是把排列一直列到第k个。另一种做法是利用康托编码,如果把n!个排列根据首个数字大小排列成n组,则每一组有(n-1)!个元素,求第k个排列,可以先令p=k/(n-1)! 求出第一个数字num[p].
然后递归做下去。更新数字k=k%(n-1)!,并在数组num中删除num[p]。如果把(n-1)!个排列根据第二个数字大小排列成(n-1)组,则每一组有(n-2)!个元素,求第k个排列,可以令p=k/(n-2)! 求出第二个数字num[p].
这样直到数组num中只有一个元素为止。
要特别注意,康托编码的第k个排列是从0开始数的。
View Code
然后递归做下去。更新数字k=k%(n-1)!,并在数组num中删除num[p]。如果把(n-1)!个排列根据第二个数字大小排列成(n-1)组,则每一组有(n-2)!个元素,求第k个排列,可以令p=k/(n-2)! 求出第二个数字num[p].
这样直到数组num中只有一个元素为止。
要特别注意,康托编码的第k个排列是从0开始数的。
class Solution { public: string getPermutation(int n, int k) { string s=""; if(n<=0||k<=0) return s; int tmp=1; string str(n,'0'); for(int i=1;i<=n;i++) { str[i-1]+=i; tmp*=i; } tmp=tmp/n; k--; for(int i=n-1;i>0;i--) { int p=k/tmp; k=k%tmp; s+=string(1,str[p]); str.erase(str.begin()+p); tmp=tmp/i; } s+=string(1,str[0]); return s; } };
View Code
相关文章推荐
- UITableView的介绍及使用
- ubuntu12.04+ros fuerte 跑ORB_SLAM代码
- DuiLib(2)——几种控件的常规属性介绍
- 4 Java基础语法(switch语句,循环语句(for,while),控制跳转语句(break,return,continue))
- HDU - 5288-OO’s Sequence-数学+分类再二分+枚举+contribution costing
- [LeetCode]Implement Stack using Queues
- JS/html/form/XMLHttpRequest Ajax 批量上传文件/图片的3种方式
- POJ1679 The Unique MST
- <%@ include file=” ”%> 和<jsp:include page=” ” flush=”true”/> 区别
- Unique Binary Search Trees
- UITableView的优化
- leetcode 300. Longest Increasing Subsequence 最长上升序列数
- LeetCode334. Increasing Triplet Subsequence
- easyui tree文本单击事件切换展开/折叠节点的状态
- Android多国语言的value文件夹命名方式
- AndroidUI组件之ActionBar--基于下拉的导航方式
- requirejs的使用
- 60. Permutation Sequence
- 这么巧妙思路(二)Longest Ordered Subsequence
- 232. Implement Queue using Stacks