算法思想:
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;
}
};