赞
踩
题目链接: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
思路:使用回溯法来求解子集类问题。
回溯分析:
- /**
- * @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)。
练习使用回溯法求解子集类问题,去重思路和组合类问题相同。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。