題目描述
給定一個 沒有重複 數字的序列,返回其所有可能的全排列。
示例:
輸入: [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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
白話題目:
算法:
詳細解釋關注 B站 【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB
C語言完全代碼
/**
* 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().
*/
#define MAX_SIZE 5000
static void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
static void dfs(int* nums, int numsSize, int* returnSize, int** returnColumnSizes,
int** ppRes)
{
static int slow = 0;
int fast = 0;
if (slow == numsSize)
{
ppRes[*returnSize] = (int*)malloc(numsSize * sizeof(int));
memcpy(ppRes[*returnSize], nums, numsSize * sizeof(int));
(*returnColumnSizes)[*returnSize] = numsSize;
(*returnSize)++;
}
else
{
for (fast = slow; fast <= numsSize - 1; fast++)
{
swap(nums + slow, nums + fast);
slow++;
dfs(nums, numsSize, returnSize, returnColumnSizes, ppRes);
slow--; // 回溯
swap(nums + slow, nums + fast);
}
}
}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int** ppRes = (int**)malloc(MAX_SIZE * sizeof(int*));
*returnSize = 0;
*returnColumnSizes = (int*)malloc(MAX_SIZE * sizeof(int));
dfs(nums, numsSize, returnSize, returnColumnSizes, ppRes);
return ppRes;
}