C语言 | Leetcode C语言题解之第47题全排列II

题目:

题解:

cpp 复制代码
int* vis;

void backtrack(int* nums, int numSize, int** ans, int* ansSize, int idx, int* perm) {
    if (idx == numSize) {
        int* tmp = malloc(sizeof(int) * numSize);
        memcpy(tmp, perm, sizeof(int) * numSize);
        ans[(*ansSize)++] = tmp;
        return;
    }
    for (int i = 0; i < numSize; ++i) {
        if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) {
            continue;
        }
        perm[idx] = nums[i];
        vis[i] = 1;
        backtrack(nums, numSize, ans, ansSize, idx + 1, perm);
        vis[i] = 0;
    }
}

int cmp(void* a, void* b) {
    return *(int*)a - *(int*)b;
}

int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    int** ans = malloc(sizeof(int*) * 2001);
    int* perm = malloc(sizeof(int) * 2001);
    vis = malloc(sizeof(int) * numsSize);
    memset(vis, 0, sizeof(int) * numsSize);
    qsort(nums, numsSize, sizeof(int), cmp);
    *returnSize = 0;
    backtrack(nums, numsSize, ans, returnSize, 0, perm);
    *returnColumnSizes = malloc(sizeof(int) * (*returnSize));
    for (int i = 0; i < *returnSize; i++) {
        (*returnColumnSizes)[i] = numsSize;
    }
    return ans;
}
相关推荐
2601_9516443212 小时前
C语言二级备考指南
c语言·编程基础·编译环境·二级考试·题库选择
闪电悠米15 小时前
力扣hot100-48.旋转图像-转置翻转详解
算法·leetcode·职场和发展
啦啦啦啦啦zzzz16 小时前
算法:贪心算法
c++·算法·leetcode·贪心算法
日拱一卒——功不唐捐17 小时前
红黑树删除(C语言)
c语言·数据结构
ziguo112220 小时前
C/C++ 错误处理全解:从 errno 到 C++ 异常
linux·c语言·c++·windows·visual studio
小+不通文墨1 天前
--no-multibyte-chars 解决OLED_data.c移植后中文乱码问题
c语言·经验分享·笔记·学习
dtq04241 天前
C语言-文件操作1
c语言·开发语言·学习
Tisfy1 天前
LeetCode 3536.两个数字的最大乘积:O(1)空间维护max2
数学·算法·leetcode·题解
Suxing91 天前
C语言基础分享:“群租房”和“点名册”——联合体与枚举
c语言·算法·c#
q27551300421 天前
AS717 Type-C转DP 8K方案外维少 AS717电路图
c语言·开发语言