给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1],
[3,1,2], [3,2,1] ] 在真实的面试中遇到过这道题?来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations
哎呀,实在是搞不定这个领扣的参数问题,头都大了,很简单的一个问题非用参数难住我
把我失败的代码放在这以供参考
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
//递归算法最简单,对这个参数很迷
//这要是能声明全局变量就好了
void backTrack(int i,int** returnColumnSizes,int *returnSize,int numsSize,int* nums)
{
if(i==numsSize-1)
{
*returnSize++;
returnColumnSizes[*returnSize]=nums;
}
else
{
for(int j =i;j<numsSize;j++)
{
int m=nums[i];
nums[i]=nums[j];
nums[j]=m;
backTrack(i+1,returnColumnSizes,returnSize,numsSize,nums);
m=nums[i];
nums[i]=nums[j];
nums[j]=m;
}
}
}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int temp=-1;
returnSize=& temp;
returnColumnSizes=(int**)malloc(100*sizeof(int*));
backTrack(0,returnColumnSizes,returnSize,numsSize,nums);
return returnColumnSizes;
}
**思路很简单这道题,就是回溯法中的排列树,还是没有剪枝的排列树,
这是框架,以后所有的类似的题目都可以套用这个框架**
void BackTrack(int i)//i是第几个数
{
if(i>n)
{//说明到底了
将这个一维数组放到返回的二维数组中;
}
else
{
for(int t=i;t<=n;n++)
swap(x[t],x[n]);//交换位置后 例如:1,2交换,变成2,1,3,别管1和3 现在2在第一位
//递归,求以2开头的排列有多少种
BackTrack(i+1);
//把位置换回来
swap(x[t],x[n]);
//继续下一次循环 例如:下一次循环把3放在第一位,求以三开头的序列
}