學渣帶你刷Leetcode0046全排列

題目描述

給定一個 沒有重複 數字的序列,返回其所有可能的全排列。

示例:

輸入: [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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章