给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
这个题突然让我又对递归产生了新的认识,递归可以是不确定层数的嵌套循环。。。所以这个题还是用递归来解,思路还是深度优先搜索,其实想还是很好想的,和之前那个组合总和很像,有些区别就是这个递归的还是所有的数字,但是已经取到的要排除掉,所以这里只好打个标记。
C++源代码:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> out;
vector<int> flag(nums.size(), 0);
permuteDFS(nums, 0, flag, out, res);
return res;
}
void permuteDFS(vector<int>& nums, int layer, vector<int>& flag, vector<int>& out, vector<vector<int>>& res)
{
if(layer==nums.size()) res.push_back(out);
else
{
for(int i=0;i<nums.size();i++)
{
if(flag[i]==0)
{
flag[i] = 1;
out.push_back(nums[i]);
permuteDFS(nums, layer+1, flag, out, res);
out.pop_back();
flag[i] = 0;
}
}
}
}
};
python3的代码用另一种方法,依旧是递归,只是这里是不断的交换两个数字,如果想不太通的话,可以只想三个数的情况,三个数就是先取第一个数,然后这种情况下先可以交换后面两个数就有了两种情况,然后第一个数和第二个数交换有了一种情况然后在这种情况下第二个数和第三个数交换就可以一共有两种情况,同理第一个数和第三个数交换也可以有两种情况。实际顺序如下:
[[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,2,1],
[3,1,2]]
python3源代码:
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res = []
self.permuteDFS(nums, 0, res)
return res
def permuteDFS(self, nums, start, res):
if start>=len(nums):
res.append(copy.deepcopy(nums))
return
for i in range(start, len(nums)):
nums[start], nums[i] = nums[i], nums[start]
self.permuteDFS(nums, start+1, res)
nums[start], nums[i] = nums[i], nums[start]