给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
C
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int** permute(int* nums, int numsSize, int* returnSize)
{
int n=numsSize;
if(n==0)
{
return NULL;
*returnSize=0;
}
int count=1;
for(int i=1;i<=n;i++)
{
count*=i;
}
int** res=(int**)malloc(sizeof(int*)*count);
for(int i=0;i<count;i++)
{
res[i]=(int*)malloc(sizeof(int)*n);
}
int k=0;
int* m=&k;
compute(res,nums,0,n-1,m);
*returnSize=count;
return res;
}
void compute(int** res,int* nums,int left,int right,int* m)
{
if(left==right)
{
memcpy(res[*m],nums,(right+1)*sizeof(int));
(*m)++;
return;
}
else
{
for(int i=left;i<=right;i++)
{
int temp=nums[i];
nums[i]=nums[left];
nums[left]=temp;
compute(res,nums,left+1,right,m);
temp=nums[i];
nums[i]=nums[left];
nums[left]=temp;
}
}
}
C++
class Solution {
public:
void help(vector<vector<int>>& res, vector<int> nums, int k)
{
if(k==nums.size())
{
res.push_back(nums);
return;
}
for(int i=k;i<nums.size();i++)
{
swap(nums[i],nums[k]);
help(res,nums,k+1);
swap(nums[i],nums[k]);
}
}
vector<vector<int>> permute(vector<int>& nums)
{
vector<vector<int>> res;
int k=0;
help(res,nums,k);
return res;
}
};
python
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
n=len(nums)
res=[]
self.compute(res,nums,0,n-1)
return res
def compute(self,res,nums,left,right):
if left==right:
res.append(nums[:])
return
else:
for i in range(left,right+1):
nums[i],nums[left]=nums[left],nums[i]
self.compute(res,nums,left+1,right)
nums[i],nums[left]=nums[left],nums[i]