力扣面试题 42 - 幂集 C语言解法 回溯算法

题目:

幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素

说明:解集不能包含重复的子集。

示例:

复制代码
 输入: nums = [1,2,3]
 输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

思路:

  1. 如果我们需要求{a,b,c}的子集,那么我们需要先求出{a,b}的子集
  2. {a,b,c}的子集即为:c分别加入{a,b}的每个子集再加上{a,b}的子集
  3. 采用回溯+递归的算法,具体方法是遍历集合的每个元素,对于每个元素,我们可以选择将它加入当前子集或不加入,然后递归地生成所有可能的子集

C语言代码:

cpp 复制代码
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */

// 回溯函数,用于生成子集
void backtrack(int* nums, int numsSize, int start, int* tempList, int tempSize, 
               int*** result, int* returnSize, int** returnColumnSizes) {
    // 将当前子集添加到结果中
    (*result) = realloc(*result, (*returnSize + 1) * sizeof(int*));  // 动态扩展结果数组
    (*result)[*returnSize] = (int*)malloc(tempSize * sizeof(int));  // 分配空间存储子集
    for (int i = 0; i < tempSize; i++) {
        (*result)[*returnSize][i] = tempList[i];  // 复制子集内容
    }
    *returnColumnSizes = realloc(*returnColumnSizes, (*returnSize + 1) * sizeof(int));  // 动态扩展列大小数组
    (*returnColumnSizes)[*returnSize] = tempSize;  // 记录当前子集的大小
    (*returnSize)++;

    // 遍历后续元素生成子集
    for (int i = start; i < numsSize; i++) {
        tempList[tempSize] = nums[i];  // 将当前元素加入子集
        backtrack(nums, numsSize, i + 1, tempList, tempSize + 1, result, returnSize, returnColumnSizes);  // 通过递序深入
    }
}

// 主函数,生成所有子集
int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    *returnSize = 0;  // 初始化子集数量
    int** result = NULL;  // 存储所有子集
    *returnColumnSizes = NULL;  // 初始化每个子集大小的数组
    int* tempList = (int*)malloc(numsSize * sizeof(int));  // 临时数组存储当前子集

    // 回溯生成子集
    backtrack(nums, numsSize, 0, tempList, 0, &result, returnSize, returnColumnSizes);

    free(tempList);  // 释放临时数组
    return result;  // 返回所有子集
}
相关推荐
RaymondZhao3430 分钟前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng113338 分钟前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
圣保罗的大教堂1 小时前
leetcode 2348. 全 0 子数组的数目 中等
leetcode
啊阿狸不会拉杆2 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路2 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
曙曙学编程3 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
你知道网上冲浪吗3 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者4 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy5 小时前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率
慧翔天地人才发展学苑5 小时前
大厂 | 华为半导体业务部2026届秋招启动
华为·面试·职场和发展·跳槽·求职招聘·职场晋升