前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >力扣78题-子集

力扣78题-子集

作者头像
ccf19881030
发布2023-02-26 16:32:45
1820
发布2023-02-26 16:32:45
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

力扣78. 子集

题目描述:

代码语言:javascript
复制
给你一个整数数组 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 中的所有元素 互不相同

参考 labuladong 的算法小抄的解法:

代码语言:javascript
复制
List<List<Integer>> res = new LinkedList<>();
// 记录回溯算法的递归路径
LinkedList<Integer> track = new LinkedList<>();

// 主函数
public List<List<Integer>> subsets(int[] nums) {
    backtrack(nums, 0);
    return res;
}

// 回溯算法核心函数,遍历子集问题的回溯树
void backtrack(int[] nums, int start) {

    // 前序位置,每个节点的值都是一个子集
    res.add(new LinkedList<>(track));
    
    // 回溯算法标准框架
    for (int i = start; i < nums.length; i++) {
        // 做选择
        track.addLast(nums[i]);
        // 通过 start 参数控制树枝的遍历,避免产生重复的子集
        backtrack(nums, i + 1);
        // 撤销选择
        track.removeLast();
    }
}

相应的C++解法代码如下:

代码语言:javascript
复制
class Solution {
private:
    // 所有冥集结果
    vector<vector<int>> res;
    // 当前子集(路径)
    vector<int> track;
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        backtrack(nums, 0);
        return res;
    }

    void backtrack(vector<int>& nums, int start) {
        res.push_back(track);

        // 回溯算法核心框架
        // 遍历选择列表
        for (int i = start; i < nums.size(); i++) {
            // 做选择
            track.push_back(nums[i]);
            backtrack(nums, i+1);
            // 撤销选择
            track.pop_back();
        }
    }
};

完整的测试示例C++代码如下:

代码语言:javascript
复制
/*
    力扣78.子集
    给你一个整数数组 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 中的所有元素 互不相同
*/

#include <iostream>
#include <vector>

using namespace std;

class Solution {
private:
    // 所有冥集结果
    vector<vector<int>> res;
    // 当前子集(路径)
    vector<int> track;
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        backtrack(nums, 0);
        return res;
    }

    void backtrack(vector<int>& nums, int start) {
        res.push_back(track);

        // 回溯算法核心框架
        // 遍历选择列表
        for (int i = start; i < nums.size(); i++) {
            // 做选择
            track.push_back(nums[i]);
            backtrack(nums, i + 1);
            // 撤销选择
            track.pop_back();
        }
    }
};

int main()
{
    vector<int> nums = { 1, 2, 3 };
    //vector<int> nums = { 0 };
    Solution sol;
    vector<vector<int>> res = sol.subsets(nums);

    for (int i = 0; i < res.size(); i++) {
        if (i == 0) {
            std::cout << "[[";
        } else {
            std::cout << "[";
        }
        for (int j = 0; j < res[i].size(); j++) {
            std::cout << res[i][j];
            if (j < res[i].size() - 1) {
                std::cout << ",";
            }
        }
        if (i < res.size() - 1) {
            std::cout << "],";
        } else {
            std::cout << "]]";
        }
    }

    return 0;
}
\运行结果
\运行结果
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 力扣78. 子集
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档