每日刷题|回溯法解决子集问题

简介: 每日刷题|回溯法解决子集问题

回溯法的理解

本文参考了一位大佬的题解,详细的介绍了回溯法:链接

上一篇刷题文: 回溯法经典问题之组合

       记住住一句话:for循环横向遍历,递归纵向遍历,回溯不断调整结果集。 这句话将从始至终贯穿我们对于以上问题的回溯解决办法。

💮 一、子集

题目链接: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 中的所有元素 互不相同

本题思路:

      采用经典的“回溯三部曲”:

       1、定义两个全局变量,一个用来存放符合条件单一结果(path),一个用来存放符合条件结果的集合(result)。注意要记得用一个变量来记录遍历的位置

       2、回溯的主体,回溯终止条件。path保存一组数据,每次遍历到叶子节点,再插入到result中,并且回溯到上一个节点。

       3、单层搜索的过程。for循环用来横向遍历,递归的过程是纵向遍历。


特别注意: 本题虽然同之前的组合问题差不多,但是还是需要做一定的变化的,依据题意,我们都知道任何一个子集都是包涵空集的,并且子集中一个元素也算子集。

        于是根据题意写出以下题解:

class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtrack(vector<int>& nums,int index)
{
    result.push_back(path);   
    if(index==nums.size())
    {
        return;
    }
    for(int i=index;i<nums.size();i++)
    {
        path.push_back(nums[i]);
        backtrack(nums,i+1);
        path.pop_back();
    }
}
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        path.clear();
        result.clear();
        sort(nums.begin(),nums.end());
        backtrack(nums,0);
        return result;
    }
};

🌺二、子集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

 本题思路:

       同样采用经典的“回溯三部曲”,但是由于此题中的元素是可以重复的,那这样必然会出现重复的子集,因此我们需要进行剪枝操作。此时可以参考 回溯法经典问题之组合中最后一题。我们也建立一个used,用于标记是否使用过使用过元素。

    特别注意: 本题虽然同之前的题差不多,但是还是需要做一定的变化的。比如插入的操作。

       一图了解题解 ~(以{1,2,2}为例)

class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void backtrack(vector<int>& nums,int index,vector<bool>& used)
{
    result.push_back(path);
    if(index==nums.size())
    {
        return;
    }
    for(int i=index;i<nums.size();i++)
    {
        if(i>0&&nums[i-1]==nums[i]&&used[i-1]==0)
        continue;
        path.push_back(nums[i]);
        used[i]=1;
        backtrack(nums,i+1,used);
        used[i]=0;
        path.pop_back();
    }
}
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        path.clear();
        result.clear();
        vector<bool> used;
        used.resize(nums.size());
        sort(nums.begin(),nums.end());
        backtrack(nums,0,used);
        return result;
    }
};



感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

相关文章
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1793 6
|
4月前
|
API
这个春节,大模型终于学会了“看图思考”
新春献礼!Qwen3.5-Plus重磅发布,支持高质量视觉理解与复杂推理一体化,图文生产力翻倍提升。效果更强、成本更低——API价格低至0.8元/百万Token,仅为Gemini 3的1/18。现已上线阿里云百炼模型广场,即刻体验!
255 5
|
数据采集 人工智能 自然语言处理
打通模型与现实世界的最后一公里?MCP极速入门指南
本文重点讲述如何快速实战上手MCP。
1694 94
打通模型与现实世界的最后一公里?MCP极速入门指南
|
9月前
|
数据采集 搜索推荐 数据可视化
基于python大数据的商品数据可视化及推荐系统
本系统基于Python、Django与ECharts,构建大数据商品可视化及推荐平台。通过爬虫获取商品数据,利用可视化技术呈现销售趋势与用户行为,结合机器学习实现个性化推荐,助力电商精准营销与用户体验提升。
|
11月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
802 0
|
机器学习/深度学习 数据采集 人工智能
TeleAI 星辰语义大模型全尺寸开源,function call能力突出
星辰语义大模型TeleChat2是由中国电信人工智能研究院(TeleAI)研发训练的大语言模型。今年9月,TeleAI 正式发布并开源了首个基于全国产化万卡集群和国产深度学习框架训练的千亿参数大模型 TeleChat2-115B ,近日又进一步开源了 TeleChat2-3B、7B和35B,以适配不同场景的应用需求。
1126 9
TeleAI 星辰语义大模型全尺寸开源,function call能力突出
|
云安全 人工智能 安全
用AI来做云安全是怎样一种体验?阿里云安全AI能力大曝光
用AI来做云安全是怎样一种体验?阿里云安全AI能力大曝光
|
人工智能 运维 监控
2025年阿里云服务器配置选择全攻略:CPU、内存、带宽与系统盘详解
在2025年,阿里云服务器以高性能、灵活扩展和稳定服务助力数字化转型,提供轻量应用服务器、通用型g8i实例等多样化配置,满足个人博客至企业级业务需求。针对不同场景(如计算密集型、内存密集型),推荐相应实例类型与带宽规划,强调成本优化策略,包括包年包月节省成本、ESSD云盘选择及地域部署建议。文中还提及安全设置、监控备份的重要性,并指出未来可关注第九代实例g9i支持的新技术。整体而言,阿里云致力于帮助用户实现性能与成本的最优平衡。 以上简介共计238个字符。
|
测试技术 开发工具 git
利用Git Hooks自动化你的开发流程
【10月更文挑战第6天】在现代软件开发中,版本控制至关重要,Git作为主流工具,提供了强大的代码管理功能。Git Hooks 是 Git 的一个特性,可在特定事件(如提交、推送)发生时自动执行脚本,实现开发流程自动化。本文介绍 Git Hooks 的基本概念、常见用例及设置方法,涵盖 pre-commit、pre-push 等多种类型的 Hooks,并展示了如何利用它们进行代码格式化、自动化测试和风格检查,提升开发效率与代码质量。通过合理应用 Git Hooks,可以显著减少人为错误,确保代码一致性,并促进团队协作。
|
Linux Shell API
ollama 大模型部署 工具 | AIGC
Ollama是一个集成了多种大型语言模型的工具,它支持模型的部署、运行以及API的整合和调用。Ollama为不同操作系统的用户提供了便捷的安装方式,并具备丰富的命令行界面(CLI)和API接口,使得用户可以轻松地管理和运行大型模型。【10月更文挑战第1天】
3220 1