TOP101题解 | BM56#有重复项数字的全排列#

有重复项数字的全排列

https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @author Senky
 * @date 2023.08.26
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * 
 * @param num int整型一维数组 
 * @param numLen int num数组长度
 * @return int整型二维数组
 * @return int* returnSize 返回数组行数
 * @return int** returnColumnSizes 返回数组列数
 */
#include <stdlib.h>
int compar(const void* p1, const void* p2)
{
    return (*(int*)p1 - *(int*)p2);
}

void backtrack(int* nums, int numsLen, int* visited, int* path, int depth, int** result, int* returnSize) 
{
    if (depth == numsLen) 
    {
        result[*returnSize] = (int*)malloc(sizeof(int) * numsLen);
        memcpy(result[*returnSize], path, sizeof(int) * numsLen);
        (*returnSize)++;
        return;
    }
    
    for (int i = 0; i < numsLen; i++) 
    {
        if (!visited[i]) 
        {
            if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) 
            {
                continue; // 剪枝,避免生成重复排列
            }
            path[depth] = nums[i];
            visited[i] = 1;
            backtrack(nums, numsLen, visited, path, depth + 1, result, returnSize);
            visited[i] = 0;
        }
    }
}

int** permuteUnique(int* num, int numLen, int* returnSize, int** returnColumnSizes) 
{   //write code here
    int totalPermutations = 1;
    for (int i = 1; i <= numLen; i++) 
    {
        totalPermutations *= i;
    }
    
    int** result = (int**)malloc(sizeof(int*) * totalPermutations);
    *returnSize = 0;
    *returnColumnSizes = (int*)malloc(sizeof(int) * totalPermutations);
    
    int* visited = (int*)calloc(numLen, sizeof(int));
    int* path = (int*)malloc(sizeof(int) * numLen);
    
    // 首先对数组进行排序,以确保重复的数字相邻
    qsort(num, numLen, sizeof(int), compar);
    
    backtrack(num, numLen, visited, path, 0, result, returnSize);
    
    free(visited);
    free(path);
    
    for (int i = 0; i < *returnSize; i++) 
    {
        (*returnColumnSizes)[i] = numLen;
    }
    
    return result;
}

Tips:

在前一题的基础上剪枝就可以了

#TOP101#
TOP101-BM系列 文章被收录于专栏

系列的题解

全部评论

相关推荐

不亏是提前批,神仙打架,鼠鼠不配了
站队站对牛:现在92都报工艺岗了
投递韶音科技等公司7个岗位
点赞 评论 收藏
分享
05-21 15:47
门头沟学院 Java
浪漫主义的虹夏:项目有亮点吗,第一个不是纯玩具项目吗,项目亮点里类似ThreadLocal,Redis储存说难听点是花几十分钟绝大部分人都能学会,第二个轮子项目也没体现出设计和技术,想实习先沉淀,好高骛远的自嗨只会害了自己
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务