Java教程

78. 子集

本文主要是介绍78. 子集,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

78. 子集

题目链接:78. 子集(中等)

难度1427收藏分享切换为英文接收动态反馈

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 10

  • -10 <= nums[i] <= 10

  • nums 中的所有元素 互不相同

解题思路

这道题和77. 组合,131. 分割回文串差不多。如果把这些题都抽象为树,那么组合问题和分割问题需要收集的是树的叶子节点,而子集问题就是收集树中的每一个节点。

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++) {
            path.push_back(nums[i]);
            backTracking(nums, i + 1);
            path.pop_back();
        }
    }
​
    vector<vector<int>> subsets(vector<int>& nums) {
        path.clear();
        result.clear();
        backTracking(nums, 0);
        return result;
    }
};

JavaScript

let path = [];
let result = [];
​
const backTracking = (nums, start) => {
    result.push([...path]);
    if (start === nums.length) return;
​
    for (let i = start; i < nums.length; i++) {
        path.push(nums[i]);
        backTracking(nums, i + 1);
        path.pop();
    }
}
​
​
var subsets = function(nums) {
    path = [];
    result = [];
    backTracking(nums, 0);
    return result;
};

 

这篇关于78. 子集的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!