给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
思路一:回溯
void swap(int *nums,int index1,int index2)
{int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;
}void prem(int* nums, int numsSize, int* returnSize, int** returnColumnSizes,int** returnNums,int offset)
{if(offset == numsSize){returnNums[*returnSize] = (int *)malloc(sizeof(int ) * numsSize);memcpy(returnNums[*returnSize],nums,sizeof(int) * numsSize );(*returnColumnSizes)[*returnSize] = numsSize;*returnSize = *returnSize + 1;}else{int i;for(i = offset; i < numsSize; i++){swap(nums,i,offset);prem(nums,numsSize,returnSize,returnColumnSizes,returnNums,offset+1);swap(nums,i,offset);}}
}int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{int **returnNums = (int **)malloc(sizeof(int *) * 721);*returnColumnSizes= (int *)malloc(sizeof(int ) * 721);*returnSize = 0;prem(nums,numsSize,returnSize,returnColumnSizes,returnNums,0);return returnNums;}
分析:
本题考虑到要列举所有可能的情况,故考虑使用回溯算法。编写prem函数来进行回溯,当遍历到末尾时申请一个新的空间来存放新的情况,否则就将i和offset交换。不断将新的情况的值赋给新的数组。最后输出数组。
总结:
本题考察了回溯算法的应用,要将回溯的各种情况考虑清楚后方能解决。