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
-
解题思路
这道题就差不多可以看做是
C++
class Solution { public: vector<int> path; vector<vector<int>> result; void backTracking(vector<int> nums, int start) { result.push_back(path); if (start == nums.size()) return; for (int i = start; i < nums.size(); i++) { if (i > start && nums[i] == nums[i - 1]) continue; path.push_back(nums[i]); backTracking(nums, i + 1); path.pop_back(); } } vector<vector<int>> subsetsWithDup(vector<int>& nums) { path.clear(); result.clear(); sort(nums.begin(), nums.end()); // 排序,从小到大 backTracking(nums, 0); return result; } };
JavaScript
let path = []; let result = []; //比较函数 const compare = (x, y) => { if (x < y) { return -1; } else if (x > y) { return 1; } else { return 0; } } const backTracking = (nums, start) => { result.push([...path]); if (start === nums.length) return; for (let i = start; i < nums.length; i++) { if (i > start && nums[i] === nums[i - 1]) continue; path.push(nums[i]); backTracking(nums, i + 1); path.pop(); } } var subsetsWithDup = function(nums) { path = []; result = []; nums.sort(compare); backTracking(nums, 0); return result; };