题目:
其实这题的核心思想和上一题是一样的(78.子集),只不过呢这道题不需要从最短开始考虑,每一次考虑的都是最长数组,因此需要使用for循环。
另外,还有一个原因,C++其实是有全排列函数的,没想到吧!
next_permutation(),求该数组或者向量的字典序的下一位
所以使用之前需要排序
思路也很简单,就是每次先固定去交换一位,然后进一步遍历,遍历完之后再换回来进入下一个循环(固定交换下一位数)
C++代码如下(这次我觉得我的比官方简洁):
class Solution {
public:
vector<vector<int>> ans;
void dfs(int i,vector<int>& nums){
if(i>=nums.size()){
ans.emplace_back(nums);
return;
}
for(int j=i;j<nums.size();j++)
{
swap(nums[j],nums[i]);
dfs(i+1,nums);
swap(nums[j],nums[i]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
dfs(0,nums);
return ans;
}
};
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ans;
int n = nums.size();
sort(nums.begin(),nums.end());
ans.emplace_back(nums);
while(next_permutation(nums.begin(),nums.end())){
ans.emplace_back(nums);
}
return ans;
}
};