90. 子集 II

90. 子集 II

题目链接: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

解题思路

这道题就差不多可以看做是78. 子集40. 组合总和 II的结合。

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;
};

 

 

 
posted @ 2021-12-27 07:43  wltree  阅读(31)  评论(0编辑  收藏  举报