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;
}
相关推荐
圣保罗的大教堂36 分钟前
leetcode 3653. 区间乘法查询后的异或 I 中等
leetcode
圣保罗的大教堂36 分钟前
leetcode 1848. 到目标元素的最小距离 简单
leetcode
charlie11451419138 分钟前
嵌入式现代C++教程实战篇第12篇:C宏时代的LED驱动 —— 能跑但不优雅
c语言·c++·stm32·单片机·嵌入式硬件·c
YuanDaima204841 分钟前
队列与单调队列基础原理与题目说明
人工智能·python·算法·leetcode·队列·手撕代码
Fanfanaas1 小时前
Linux 系统编程 进程篇 (二)
linux·运维·服务器·c语言·开发语言·学习
念恒123061 小时前
Linux基础开发工具(编写一个简易进度条)
linux·c语言
Tisfy1 小时前
LeetCode 2515.到目标字符串的最短距离:从中间往两边遍历
算法·leetcode·字符串·题解·数组·遍历
jinyishu_1 小时前
链表经典算法题(2)
c语言·数据结构·链表
_日拱一卒2 小时前
LeetCode:142环形链表Ⅱ
算法·leetcode·链表
黎雁·泠崖2 小时前
二叉树遍历:LeetCode 144 / 94 / 145 之递归 + 分治 + 非递归
java·数据结构·算法·leetcode