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;
}
相关推荐
weixin_461769401 天前
15. 三数之和
c++·算法·leetcode·三数之和
千金裘换酒1 天前
LeetCode 链表两数相加
算法·leetcode·链表
SmartRadio1 天前
在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留
linux·c语言·开发语言·人工智能·单片机·嵌入式硬件·lora
独自破碎E1 天前
二分查找-I
leetcode
jimy11 天前
C语言里面的中断程序:“exit()”和“return返回”
c语言
SmartRadio1 天前
进一步优化CH585M的低功耗模式
c语言·开发语言·单片机·嵌入式硬件·物联网
千金裘换酒1 天前
LeetCode 删除链表的倒数第N个结点
算法·leetcode
老鼠只爱大米1 天前
LeetCode算法题详解 42:接雨水
leetcode·动态规划·双指针·单调栈·接雨水·雨水收集
AlenTech1 天前
739. 每日温度 - 力扣(LeetCode)
算法·leetcode·职场和发展
老鼠只爱大米1 天前
LeetCode算法题详解 11:盛最多水的容器
leetcode·面试题·双指针·盛最多水的容器·面积最大化