题目大意:给出一个数组,求出数组中元素的所有排列。
算法思想:
1.首先将数组升序排序,并将结果放入集合中。
2.然后利用STL中的next_permutation()算法求出数组中元素的所有排列。
算法思想:
1.首先将数组升序排序,并将结果放入集合中。
2.然后利用STL中的next_permutation()算法求出数组中元素的所有排列。
代码如下:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> >res;
if(nums.size()==0) return res;
sort(nums.begin(),nums.end());
res.push_back(nums);
while(next_permutation(nums.begin(),nums.end())){
res.push_back(nums);
}
return res;
}
};
解法二(字典序求解全排列法):
1.将所给的字符串排序。
2.找出p=max{i|a[i]<a[j]}
3.找出q=max{j|a[p]<a[j]}
4.swap(a[p],a[q])
5.将a[p+1]后的所有元素倒序.
6按2~5找出所有的排列。
代码如下:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > res;
if (nums.size() == 0) return res;
sort(nums.begin(),nums.end());
int n = nums.size();
res.push_back(nums);
while (1){
int p = -1, q = -1;
for (int i = n - 2; i >= 0; --i){//1.从右向左寻找p=max{i|a[i]<a[i+1]}
if (nums[i] < nums[i + 1])
{
p = i;
break;
}
}
if (p != -1){//存在下一个排列
for (int j = n - 1; j >p; --j){//2.从右向左寻找q=max{j|a[i]<a[j]}
if (nums[p] < nums[j])
{
q = j;
break;
}
}
swap(nums[p], nums[q]);//3.交换a[p]a[q]
int start = p+1, end = n - 1;
while (start < end){//4.将a[p+1]之后的元素倒序
swap(nums[start], nums[end]);
++start;
--end;
}
res.push_back(nums);
}
else//不存在下一个排列了
break;
}
return res;
}
};