200.回溯算法:子集||(力扣)

class Solution {
public:vector<int> res;                // 当前子集vector<vector<int>> result;     // 存储所有子集void backtracing(vector<int>& nums, int index, vector<bool>& used) {result.push_back(res);      // 将当前子集加入结果for (int i = index; i < nums.size(); i++) {// 跳过重复元素if (i > 0 && nums[i] == nums[i - 1] && used[i - 1]==false) {continue;}res.push_back(nums[i]);  // 将当前元素加入子集used[i] = true;          // 标记当前元素已使用backtracing(nums, i + 1, used); // 递归生成后续子集used[i] = false;         // 取消标记,回溯res.pop_back();          // 从子集中移除当前元素,回溯}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<bool> used(nums.size(), false);  // 标记数组元素是否被使用sort(nums.begin(), nums.end());         // 排序数组以便于去重backtracing(nums, 0, used);             // 调用回溯函数开始生成子集return result;                          // 返回所有生成的子集}
};

主函数调用

  1. subsetsWithDup 函数:
    • 输入 nums = {1, 2, 2}
    • 初始化 used = {false, false, false}
    • nums 进行排序(尽管已经排好序了),结果 nums = {1, 2, 2}
    • 调用 backtracing(nums, 0, used)

回溯函数执行

  1. 第一次调用 backtracing(nums, 0, used):

    • index = 0
    • 当前子集 res = {}
    • 当前结果 result = {{}}

    循环1(i = 0):

    • nums[0] = 1 未使用
    • res.push_back(1) -> res = {1}
    • used[0] = true
    • 调用 backtracing(nums, 1, used)
  2. 第二次调用 backtracing(nums, 1, used):

    • index = 1
    • 当前子集 res = {1}
    • 当前结果 result = {{}, {1}}

    循环1(i = 1):

    • nums[1] = 2 未使用
    • res.push_back(2) -> res = {1, 2}
    • used[1] = true
    • 调用 backtracing(nums, 2, used)
  3. 第三次调用 backtracing(nums, 2, used):

    • index = 2
    • 当前子集 res = {1, 2}
    • 当前结果 result = {{}, {1}, {1, 2}}

    循环1(i = 2):

    • nums[2] = 2 未使用
    • res.push_back(2) -> res = {1, 2, 2}
    • used[2] = true
    • 调用 backtracing(nums, 3, used)
  4. 第四次调用 backtracing(nums, 3, used):

    • index = 3
    • 当前子集 res = {1, 2, 2}
    • 当前结果 result = {{}, {1}, {1, 2}, {1, 2, 2}}
    • 结束条件 index >= nums.size() 达成,返回上一层

    回溯:

    • res.pop_back() -> res = {1, 2}
    • used[2] = false
    • 返回上一层
  5. 回到第三次调用 backtracing(nums, 2, used):

    • 当前子集 res = {1, 2}
    • 当前结果 result = {{}, {1}, {1, 2}, {1, 2, 2}}

    回溯:

    • res.pop_back() -> res = {1}
    • used[1] = false

    循环2(i = 2):

    • nums[2] = 2 未使用,且 nums[2] == nums[1],但 used[1] == false,跳过
    • 返回上一层
  6. 回到第二次调用 backtracing(nums, 1, used):

    • 当前子集 res = {1}
    • 当前结果 result = {{}, {1}, {1, 2}, {1, 2, 2}}

    回溯:

    • res.pop_back() -> res = {}
    • used[0] = false

    循环2(i = 1):

    • nums[1] = 2 未使用
    • res.push_back(2) -> res = {2}
    • used[1] = true
    • 调用 backtracing(nums, 2, used)
  7. 第五次调用 backtracing(nums, 2, used):

    • index = 2
    • 当前子集 res = {2}
    • 当前结果 result = {{}, {1}, {1, 2}, {1, 2, 2}, {2}}

    循环1(i = 2):

    • nums[2] = 2 未使用
    • res.push_back(2) -> res = {2, 2}
    • used[2] = true
    • 调用 backtracing(nums, 3, used)
  8. 第六次调用 backtracing(nums, 3, used):

    • index = 3
    • 当前子集 res = {2, 2}
    • 当前结果 result = {{}, {1}, {1, 2}, {1, 2, 2}, {2}, {2, 2}}
    • 结束条件 index >= nums.size() 达成,返回上一层

    回溯:

    • res.pop_back() -> res = {2}
    • used[2] = false
    • 返回上一层
  9. 回到第五次调用 backtracing(nums, 2, used):

    • 当前子集 res = {2}
    • 当前结果 result = {{}, {1}, {1, 2}, {1, 2, 2}, {2}, {2, 2}}

    回溯:

    • res.pop_back() -> res = {}
    • used[1] = false
    • 返回上一层
  10. 回到第一次调用 backtracing(nums, 0, used):

    • 当前子集 res = {}
    • 当前结果 result = {{}, {1}, {1, 2}, {1, 2, 2}, {2}, {2, 2}}

    循环3(i = 2):

    • nums[2] = 2 未使用,且 nums[2] == nums[1],但 used[1] == false,跳过
  11. 结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式Linux】<总览> 进程间通信(更新中)

文章目录 前言 一、管道 1. 概念 2. 匿名管道 3. 有名管道 二、内存映射区 1. 概念 2. mmap函数 3. 进程间通信&#xff08;有血缘关系&#xff09; 4. 进程间通信&#xff08;没有血缘关系&#xff09; 5. 拷贝文件 前言 在文章【嵌入式Linux】&#xff1c;总览&a…

浏览器断点调试(用图说话)

浏览器断点调试&#xff08;用图说话&#xff09; 1、开发者工具2、添加断点3、查看变量值 浏览器断点调试 有时候我们需要在浏览器中查看 html页面的js中的变量值。1、开发者工具 打开浏览器的开发者工具 按F12 &#xff0c;没反应的话按FnF12 2、添加断点 3、查看变量值

清理占道经营商贩自砸西瓜?智慧城管AI视频方案助力城市街道管理

一、背景分析 近日有新闻报道&#xff0c;在山西太原&#xff0c;城管凌晨3时许查处商贩占道经营&#xff0c;商贩将西瓜砸碎一地&#xff0c;引起热议。据悉&#xff0c;事件发生的五龙口街系当地主要街道&#xff0c;来往车辆众多。该商贩长期在该地段占道经营&#xff0c;影…

昇思25天学习打卡营第2天|快速入门

快速入门 操作步骤1.引入依赖包2.下载Mnist数据集3.划分训练集和测试集4.数据预处理5.网络构建6.模型训练7.保存模型8.加载模型9.模型预测 今天通过昇思大模型平台AI实验室提供的在线Jupyter工具&#xff0c;快速入门MindSpore。 目标&#xff1a;通过MindSpore的API快速实现一…

云计算 | 期末梳理(下)

1.模运算 2. 拓展欧几里得算法 3.扩散和混淆、攻击的分类 香农的贡献:定义了理论安全性,提出扩散和混淆原则,奠定了密码学的理论基础。扩散:将每一位明文尽可能地散布到多个输出密文中去,以更隐蔽明文数字的统计特性。混淆:使密文的统计特性与明文密钥之间的关系尽量复杂…

深入解析直播带货系统源码:短视频商城APP开发全攻略

本篇文章&#xff0c;小编将深入解析直播带货系统的源码&#xff0c;并为开发短视频商城APP提供全攻略&#xff0c;助力开发者打造高效、稳定的带货平台。 一、直播带货系统概述 直播带货系统主要由直播模块、商品管理模块、订单处理模块、用户管理模块、以及支付模块等组成。…

Ubuntu20.04使用Samba

目录 一、Samba介绍 Samba 的主要功能 二、启动samba 三、主机操作 四、Ubuntu与windows系统中文件互联 五、修改samba路径 一、Samba介绍 Samba 是一个开源软件套件&#xff0c;用于在 Linux 和 Unix 系统上实现 SMB&#xff08;Server Message Block&#xff09;协议…

速卖通自养号测评:安全高效的推广手段

在速卖通平台上&#xff0c;卖家们常常寻求各种方法来提升商品的曝光、转化率和店铺权重。其中&#xff0c;自养号测评作为一种低成本、高回报的推广方式&#xff0c;备受关注。然而&#xff0c;若操作不当&#xff0c;也可能带来风险。以下是如何安全有效地进行自养号测评的指…

VS Code 使用 Makefile 运行 CPP项目

Installing the MinGW-w64 toolchainCMake Toolsmakelist.txt报错 1报错 2报错 3生成了 Makefile &#xff0c;如何使用 make 命令 Installing the MinGW-w64 toolchain 参见文档 将 GCC 与 MinGW 结合使用 CMake Tools 参见文档 Linux 上的 CMake 工具入门 CMake 的使用 …

关于Pycharm右下角不显示解释器interpreter的问题解决

关于Pycharm右下角不显示解释器interpreter的问题 在安装新的Pycharm后&#xff0c;发现右下角的 interpreter 的选型消失了&#xff1a; 觉得还挺不习惯的&#xff0c;于是网上找解决办法&#xff0c;无果。 自己摸索了一番后&#xff0c;发现解决办法如下&#xff1a; 勾…

37岁,被裁员,失业三个月,被面试官嫌弃“太水”:就这也叫10年以上工作经验?

今年部门要招两个自动化测试&#xff0c;这几个月我面试了几十位候选人。发现一个很奇怪的现象&#xff0c;面试中一问到元素定位、框架api、脚本编写之类的&#xff0c;很多候选人都对答如流。但是一问到实际项目&#xff0c;比如“项目中UI自动化和接口自动化如何搭配使用&am…

电商平台家电以旧换新销售额增长超80%

记者近日从国家发展和改革委员会举办的新闻发布会上获悉&#xff0c;今年1—5月份&#xff0c;主要电商平台家电以旧换新销售额增长超过80%&#xff0c;以旧换新成为推动家电消费增长的重要因素。 今年3月&#xff0c;国务院印发了《推动大规模设备更新和消费品以旧换新行动方…

天花板国际幼儿园是怎样的?一起来听听天津惠灵顿幼儿园园长分享

上周&#xff0c;天津惠灵顿幼儿园举行了精彩的毕业典礼。一如往常&#xff0c;这是一个回顾过去、展望未来的机会。这届毕业班有一些孩子是四年前园长加入惠灵顿学校的时入园的。他们从小小班启航&#xff0c;在这所天津国际幼儿园开始了他们的惠灵顿之旅。四年来&#xff0c;…

java基于ssm+jsp 班级同学录网站

1前台首页功能模块 班级同学录网站&#xff0c;在前台首页可以查看首页、公告信息、校友风采、论坛信息、我的、跳转到后台、客服等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户注册&#xff0c;在用户注册页面可以填写用户名、姓名、头像、性别、手机号码、邮箱等…

[leetcode]unique-paths 不同路径

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> f(m, vector<int>(n));for (int i 0; i < m; i) {f[i][0] 1;}for (int j 0; j < n; j) {f[0][j] 1;}for (int i 1; i &l…

站在巨人的肩膀上 C语言理解和简单练习(包含指针前的简单内容)

1.格式化的输入/输出 1.1printf函数 printf函数你需要了解的就是转换说明&#xff0c;转换说明的作用是将内存中的二进制转换成你所需要的格式入%d就是将内存中存储的变量的二进制转化为十进制并打印出来&#xff0c;同时我们可以在%X的转换说明对精度和最小字段宽度的指定&a…

ORA-6544[pevm_peruws_callback-1][604] is caused (Doc ID 2638095.1)

ORA-6544[pevm_peruws_callback-1][604] is caused (Doc ID 2638095.1)​编辑To Bottom In this Document Symptoms Cause Solution References Applies to: Oracle Database - Enterprise Edition - Version 12.2.0.1 and later Information in this document applies to an…

C++并发之环形队列(ring,queue)

目录 1 概述2 实现3 测试4 运行 1 概述 最近研究了C11的并发编程的线程/互斥/锁/条件变量&#xff0c;利用互斥/锁/条件变量实现一个支持多线程并发的环形队列&#xff0c;队列大小通过模板参数传递。 环形队列是一个模板类&#xff0c;有两个模块参数&#xff0c;参数1是元素…

[学习笔记] 禹神:一小时快速上手Electron笔记,附代码

课程地址 禹神&#xff1a;一小时快速上手Electron&#xff0c;前端Electron开发教程_哔哩哔哩_bilibili 笔记地址 https://github.com/sui5yue6/my-electron-app 进程通信 桌面软件 跨平台的桌面应用程序 chromium nodejs native api 流程模型 main主进程 .js文件 node…

Verilog HDL语法入门系列(二):Verilog的语言文字规则

目录 1 空白符和注释2 整数常量和实数常量3 整数常量和实数常量4 字符串&#xff08;string)5 格式符与转义符6 标识符(identifiers) 微信公众号获取更多FPGA相关源码&#xff1a; 1 空白符和注释 2 整数常量和实数常量 Verilog中&#xff0c;常量(literals)可是整数也可以是…