46. 全排列

140 阅读1分钟

题目描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例

示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/pe…

实现

int getValue(int n)
{
    for (int i = n - 1; i >= 1; i--) {
        n *= i;
    }
    return n;
}

void swap(int *nums, int i, int j)
{
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}

void backtracking(int *nums, int numsSize, int *returnSize, int **returnColumnSizes, int idx, int **result)
{
    if (idx  == numsSize - 1) {    // i 是最后一个,全交换过了
        result[*returnSize] = (int*)malloc(sizeof(int) * numsSize);
         (*returnColumnSizes)[*returnSize] = numsSize;
        for (int i = 0; i < numsSize; i++) {
            result[*returnSize][i] = nums[i];
        }
        (*returnSize)++;
        return;
    }
    for (int i = idx; i < numsSize; i++) {

        swap(nums, i, idx);
        backtracking(nums, numsSize, returnSize, returnColumnSizes, idx + 1, result);
        swap(nums, i, idx);
    }
}

int **permute(int *nums, int numsSize, int *returnSize, int **returnColumnSizes)
{
    *returnSize = 0;
    *returnColumnSizes = (int*)malloc(sizeof(int*) * getValue(numsSize));   // 排列组合次 
    if (nums == NULL || numsSize == 0) {
        returnColumnSizes = NULL;
        return NULL;
    }

    int **result = (int**)malloc(sizeof(int*) * getValue(numsSize));
    memset(*returnColumnSizes, 0, sizeof(int) * getValue(numsSize));
    memset(result, 0, sizeof(int*) * getValue(numsSize));

    backtracking(nums, numsSize, returnSize, returnColumnSizes, 0, result);
    return result;
}