排列问题
第k大的排列以 perm[k/(n-1)!] 开头.第k大的n个元素的排列, 等于以perm[k/(n-1)!]开头的元素, 上去掉这个元素后剩下的元素组成的第 k % (n-1)! 大的排列.于是就有了一个很简单的递归关系:
kth_perm(perm, k) = perm[k/(n-1)!] + kth_perm(perm[0..i-1] + perm[i..n-1], k % (n-1)!)根据这个关系可以写出kth_permutation的代码:
vector<int> kth_permutation(const vector<int> &vec, int k){if (k == 0)return vec;int n = vec.size();k %= fact(n);int t = fact(n-1);int i = k / t;int kk = k % t;vector<int> result;result.push_back(vec[i]);vector<int> left;copy(vec.begin(), vec.begin()+i, back_inserte...阅读全文
kth_perm(perm, k) = perm[k/(n-1)!] + kth_perm(perm[0..i-1] + perm[i..n-1], k % (n-1)!)根据这个关系可以写出kth_permutation的代码:
vector<int> kth_permutation(const vector<int> &vec, int k){if (k == 0)return vec;int n = vec.size();k %= fact(n);int t = fact(n-1);int i = k / t;int kk = k % t;vector<int> result;result.push_back(vec[i]);vector<int> left;copy(vec.begin(), vec.begin()+i, back_inserte...阅读全文