当前位置: 代码迷 >> 综合 >> 【LeetNode】permutations permutations-ii( 递归法实现 和STL中的next_permutation函数实现)
  详细解决方案

【LeetNode】permutations permutations-ii( 递归法实现 和STL中的next_permutation函数实现)

热度:32   发布时间:2023-12-01 02:02:03.0

next_permutaion和prev_permutation


STL中迭代器范围内的排列算法,next_permutaion和prev_permutation即是。

头文件:
#include <algorithm>函数原型:
bool next_permutation(iterator start, iterator end);

next_permutation函数的返回值是布尔类型

next_permutation()函数功能是输出所有比当前排列大的排列,顺序是从小到大。
prev_permutation()函数功能是输出所有比当前排列小的排列,顺序是从大到小。


要理解next_permutation和prev_permutation,先看看什么是全排列中的“下一个全排列”,
什么是“上一个全排列”。考虑由三个字符组成的序列{
   a,b,c},这个序列的全排列有6组元素,
分别是abc, acb, bac, bca, cab, cba。上面的6组元素是按照字典序排序的。
acb即是abc的下一个全排列,同样,cab是cba的上一个全排列。我们再来看下面一个例子,有如下的一个数组1  2  7  4  3  1下一个排列为:1  3  1  2  4  7那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,
到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换23,
再把此时3后面的所有数字转置一下即可,步骤如下:1  2  7  4  3  11  2  7  4  3  11  3  7  4  2  1 // 3 和 2交换1  3  1  2  4  7 // 交换完后 将3后面的按照升序排列 // (升序就是最小的排序,降序是最大的排序)

permutations


Given a collection of numbers, return all possible permutations.
For example,
[1,2,3]have the following permutations:
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], and[3,2,1].

方法一:

class Solution {
public:vector<vector<int> > permute(vector<int> &num) {vector<vector<int> > V;sort(num.begin(),num.end());do{V.push_back(num);}while(next_permutation(num.begin(),num.end()));return V;}
};

方法二:

class Solution {
public:vector<vector<int> > permute(vector<int> &num) {vector<vector<int>> V;permutations(V,num,0);return V;}void permutations(vector<vector<int>> &V ,vector<int> &num, int s ){if(s == num.size()-1)V.push_back(num);else{for( int i = s; i < num.size(); i++ ){swap(num[s],num[i]);permutations(V,num,s+1);swap(num[s],num[i]);}}}
};

permutation-ii


Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]have the following unique permutations:
[1,1,2],[1,2,1], and[2,1,1].

方法一:

class Solution {
public:vector<vector<int> > permute(vector<int> &num) {vector<vector<int> > V;sort(num.begin(),num.end());do{V.push_back(num);}while(next_permutation(num.begin(),num.end()));return V;}
};

方法二:

class Solution {
public:vector<vector<int> > permute(vector<int> &num) {vector<vector<int>> V;_permuteUnique(num,V,0);return V;}bool IsUnique(vector<int> &num,vector<vector<int> > &V){for(int i =0;i < V.size(); i++){if( num == V[i])return false;}return true;}void _permuteUnique(vector<int> &num,vector<vector<int> > &V,int s){if( s == num.size()-1 && IsUnique(num,V)){V.push_back(num);}else{for(int i = s; i < num.size(); i++){if( num[s] != num[i] ){swap(num[s],num[i]);_permuteUnique(num,V,s+1);swap(num[s],num[i]);}else_permuteUnique(num,V,s+1);}}   }
};
  相关解决方案