31.Next Permutation ,解法见上一篇博客;
46.全排列
描述:
Given a collection of distinct 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>& nums) {
int col=nums.size();
int row=1;
for(int i=1;i<=col;i++)//求阶乘
row*=i;
vector< vector<int> > result(row);
for(int i=0;i < row ;i++)
result[i].resize(col);//设置数组的大小row行,col列
if(nums.empty())
return result;
vector<int> tmpnums=nums;
sort(tmpnums.begin(),tmpnums.end());//先排序
result[0]=tmpnums;
for(int i=1;i<row;i++)
{
next_permutation(tmpnums.begin(), tmpnums.end());
result[i]=tmpnums;
}
return result;
}
};
47。全排列2
描述:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
分析:
还是用下一个排列的思想,即使有重复数,求法不变;
代码:
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end()); //排序,第一个序列必须有序
vector<int> tmpnums=nums;
vector< vector<int> > result;
result.push_back(nums); //没有计算有多少个序列
while(true)
{
next_permutation(tmpnums.begin(), tmpnums.end());
if(tmpnums==nums)//说明求完了
break;
result.push_back(tmpnums); //原来一行一行的压入数据可以这样!!!
}
return result;
}
};
60 . Permutation Sequence
描述:
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例 1:
输入: n = 3, k = 3
输出: "213"
示例 2:
输入: n = 4, k = 9
输出: "2314"
分析:
简单的,用暴力枚举的方法,调用k-1次下一个排列的函数,把前k个排列全求出来
代码
class Solution {
public:
void next_permutation(string& nums) {
if(nums.empty() || nums.size()==1)
return;
string::iterator ite1=nums.end()-1;
for(;;)
{
string::iterator ite2=ite1;
ite1--;
if(*ite1 < *ite2)
{
string::iterator itej=nums.end();
while(!(*ite1 < *--itej));
iter_swap(ite1,itej);
reverse(ite2,nums.end());
return;
}
if(ite1==nums.begin())
{
reverse(nums.begin(),nums.end());
return;
}
}
}
string getPermutation(int n, int k) {
string result(n,'0');
for(int i=1;i<=n;i++)
result[i-1]=i+'0';
for(int i=0;i<k-1;i++)//执行k-1次
next_permutation(result);
return result;
}
};