【LeetCode】90. 子集 II(中等)——代码随想录算法训练营Day28

题目链接:90. 子集 II

题目描述

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

文章讲解:代码随想录

视频讲解:回溯算法解决子集问题,如何去重?| LeetCode:90.子集II_哔哩哔哩_bilibili

题解1:回溯法

思路:使用回溯法来求解子集类问题。

回溯分析:

  • 递归函数的参数和返回值:首先创建2个变量 res 和 path,path 记录遍历的路径,res 记录结果。递归函数的返回值为 void,参数是 start,用来记录本次递归的开始位置。
  • 递归函数的终止条件:找到叶子节点,即 start 和 nums.length 相同,也就是查找完毕。
  • 单层递归的逻辑:将当前路径作为子集记录到结果数组中,使用 for 循环从开始位置 start 开始直到 nums.length 横向遍历,递归的向下纵向遍历寻找组合。
  • 剪枝:无。
  • 去重:树层去重。
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsetsWithDup = function(nums) {
    nums.sort((a, b) => a - b);
    const res = []; // 结果数组
    const path = []; // 路径
    const backtracking = function (start) {
        res.push([...path]);
        for (let i = start; i < nums.length; i++) {
            if (i > start && nums[i] === nums[i - 1]) {
                continue; // 树层去重
            }
            path.push(nums[i]); // 记录路径
            backtracking(i + 1); // 向下查找
            path.pop(); // 回溯
        }
    }
    backtracking(0);
    return res;
};

分析:时间复杂度为 O(n * 2 ^ n),空间复杂度为 O(n)。

收获

练习使用回溯法求解子集类问题,去重思路和组合类问题相同。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-07 17:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-07 17:28:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-07 17:28:02       82 阅读
  4. Python语言-面向对象

    2024-02-07 17:28:02       91 阅读

热门阅读

  1. Ubuntu23.04编译VLC3.0.20的各种错误处理

    2024-02-07 17:28:02       53 阅读
  2. 计算机网络相关题目及答案(第三章)

    2024-02-07 17:28:02       50 阅读
  3. 多个Nginx虚拟主机部署脚本

    2024-02-07 17:28:02       48 阅读
  4. NCCL源码解析: P2P 连接的建立

    2024-02-07 17:28:02       92 阅读
  5. OpenCV 入门教程

    2024-02-07 17:28:02       41 阅读
  6. 排队论——不同实体的到达过程组合问题

    2024-02-07 17:28:02       43 阅读
  7. 代码随想录算法训练营29期Day43|LeetCode 1049,494,474

    2024-02-07 17:28:02       48 阅读
  8. [C语言]C语言实战项目------单链表通讯录

    2024-02-07 17:28:02       45 阅读