当前位置: 首页 > article >正文

78. Subsets和90. Subsets II

目录

78.子集

方法一、迭代法实现子集枚举

方法二、递归法实现子集枚举

方法三、根据子集元素个数分情况收集

方法四、直接回溯法

90.子集二

方法一、迭代法实现子集枚举

方法二、递归法实现子集枚举

方法三、根据子集元素个数分情况收集

方法四、直接回溯法


78.子集

78. Subsets

方法一、迭代法实现子集枚举

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> res;vector<int> aset;int n = nums.size();int m = 1<<n;//pow(2,n);//子集总数是2的n次方个for(int mask = 0;mask <m;mask++){aset.clear();for(int i = 0;i < n;i++){if(mask & (1<<i))aset.push_back(nums[i]);}res.push_back(aset);}return res;}
};

方法二、递归法实现子集枚举

class Solution {vector<vector<int>> res;vector<int> aset;
public:vector<vector<int>> subsets(vector<int>& nums) {dfs(nums,0);return res;}void dfs(vector<int>& nums,int index){if(index == nums.size()){res.push_back(aset);return;}//当前子集选择nums[index]aset.push_back(nums[index]);dfs(nums,index+1);aset.pop_back();//当前子集不选nums[index]dfs(nums,index+1);}
};

方法三、根据子集元素个数分情况收集

 子集中元素的个数可以是0,1,2...,nums.size()

对于每一种情况,可以用回溯来收集。

class Solution {vector<vector<int>> res;vector<int> aset;
public:vector<vector<int>> subsets(vector<int>& nums) {//子集中元素的个数可以是0,1,2...,nums.size()for(int count = 0; count <= nums.size();count++){backtracking(nums,0,count);}return res;}//从nums中收集元素个数为total_count的子集void backtracking(vector<int>& nums,int start,int total_count){if(aset.size() == total_count){res.push_back(aset);return;}for(int i = start;i < nums.size();i++){aset.push_back(nums[i]);backtracking(nums,i+1,total_count);aset.pop_back();}}
};

方法四、直接回溯法

class Solution {vector<vector<int>> res;vector<int> aset;
public:vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums,0);return res;}void backtracking(vector<int>& nums,int start){res.push_back(aset);//收集子集要放在前面,不然会遗漏// if(start == nums.size()) //终止条件可不写,因为下面的遍历也是这个条件//     return;for(int i = start ;i < nums.size();i++){aset.push_back(nums[i]);backtracking(nums,i+1);aset.pop_back();}}
};

90.子集二

90. Subsets II

方法一、迭代法实现子集枚举

class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>> res;vector<int> aset;bool flag = true;int n = nums.size();int m = 1<<n;for(int mask = 0;mask < m;mask++){aset.clear();flag = true;for(int i = 0;i < n;i++){if(mask & (1<<i)){if(i > 0 && (mask&(1<<(i-1))) == 0 && nums[i]==nums[i-1]){flag = false;break;}aset.push_back(nums[i]);}}if(flag)res.push_back(aset);}return res;}
};

方法二、递归法实现子集枚举

class Solution {vector<vector<int>> res;vector<int> aset;
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(false,nums,0);return res;}void dfs(bool choseLast,vector<int>& nums,int index){if(index == nums.size()){res.push_back(aset);return;}dfs(false,nums,index+1);if(!choseLast && index > 0 && nums[index] == nums[index-1])return;aset.push_back(nums[index]);dfs(true,nums,index+1);aset.pop_back();}
};

方法三、根据子集元素个数分情况收集

class Solution {vector<vector<int>> res;vector<int> aset;
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());//后面树层去重,需要先排序,让相等的元素相邻int n = nums.size();//子集中元素的个数可能是0,1,2,...nfor(int count = 0;count <=n;count++){backtracking(nums,0,count);}return res;}void backtracking(vector<int>& nums,int start,int total_count){if(aset.size() == total_count){//子集中元素个数已经达到目标个数total_countres.push_back(aset);return;}for(int i = start;i < nums.size();i++){if(i > start && nums[i] == nums[i-1])//树层去重,continue;//可以把这里的循环理解为回溯树横向上不同子集的遍历,相同元素不跳过会导致重复收集之前收集过的答案aset.push_back(nums[i]);backtracking(nums,i+1,total_count);//这里的递归是对同一个子集的下一个元素的选取,同一个子集中是允许元素重复的。aset.pop_back();}}
};

方法四、直接回溯法

收集回溯树的结点

class Solution {vector<vector<int>> res;vector<int> aset;
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());backtracking(nums,0);return res;}void backtracking(vector<int>& nums,int start){res.push_back(aset);for(int i = start;i < nums.size();i++){if(i>start && nums[i]==nums[i-1])continue;aset.push_back(nums[i]);backtracking(nums,i+1);aset.pop_back();}}
};

相关文章:

78. Subsets和90. Subsets II

目录 78.子集 方法一、迭代法实现子集枚举 方法二、递归法实现子集枚举 方法三、根据子集元素个数分情况收集 方法四、直接回溯法 90.子集二 方法一、迭代法实现子集枚举 方法二、递归法实现子集枚举 方法三、根据子集元素个数分情况收集 方法四、直接回溯法 78.子集…...

VSCode 插件 GitLens 破解方法

文章目录 1. 安装指定版本2. 修改插件文件3. 重启 VSCode 1. 安装指定版本 在 VSCode 中打开扩展&#xff08;Ctrl Shift X&#xff09;&#xff0c;搜索 GitLens&#xff0c;右键点击 安装特定版本&#xff0c;在弹出的窗口中选择 17.0.2&#xff0c;然后等待安装完成。 2…...

linux 通过命令将 MinIO 桶的权限设置为 Custom(自定义策略)

在 Ubuntu 下&#xff0c;如果要通过命令将 MinIO 桶的权限设置为 Custom&#xff08;自定义策略&#xff09;&#xff0c;可以使用 mc&#xff08;MinIO Client&#xff09;、AWS CLI 或直接调用 MinIO API&#xff08;如 curl&#xff09;。以下是几种方法&#xff1a; 方法 …...

模型评价指标介绍

模型评价指标介绍 **在机器学习与数据科学领域&#xff0c;构建模型仅是工作的一部分&#xff0c;更为关键的是要精准评估模型的性能。模型评价指标作为衡量模型表现的标准&#xff0c;有助于数据科学家、分析师等从业者判断模型的优劣&#xff0c;进而进行优化与改进。不同类…...

ElasticSearch整合SpringBoot

ElasticSearch 整合SpringBoot ES官方提供了各种不同语言的客户端。用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过HTTP请求发送给ES。 设计索引库 跟据数据库的表结构进行ES索引库的创建时。如果字段需要进行倒排索引的时候请为它指定分词器。如果该字段不是…...

ArcGIS Pro 3.4 二次开发 - 知识图谱

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 知识图谱1 知识图谱数据存储1.1 打开与知识图谱的连接1.2 从KnowledgeGraphLayer获取连接1.3 检索GDB要素类和定义1.4 检索GDB表和定义1.5 从知识图谱数据存储中获取服务 Uri1.6 将一组对象ID转换为实体的ID1.7 将一组ID转换为实体…...

2025上半年软考高级系统架构设计师经验分享

笔者背景 笔者在成都工作近7年&#xff0c; 一直担任研发大头兵&#xff0c;平日工作主要涵盖应用开发&#xff08;Java&#xff09;与数仓开发&#xff0c;对主流数据库、框架等均有涉猎&#xff0c;但谈不上精通。 最近有一些职业上的想法&#xff0c;了解到软考有那么一丁点…...

uni-app学习笔记十二-vue3中创建组件

通过组件&#xff0c;可以很方便地实现页面复用&#xff0c;减少重复页面的创建&#xff0c;减少重复代码。一个页面可以引入多个组件。下面介绍在HBuilder X中创建组件的方法&#xff1a; 一.组件的创建 1.选中项目&#xff0c;右键-->新建目录(文件夹)&#xff0c;并将文…...

React 虚拟dom

虚拟dom react核心机制 内存中轻量级JS对象树模拟真实DOM&#xff0c;主要目的是减少操作真实dom的开销 具体是通过diff算法计算最小的变更&#xff0c;批处理更新真实dom元素 diff算法 特点 同级去进行比较&#xff0c;不涉及跨层的一个比较 使用key值优化列表遍历过程 …...

互联网大厂Java求职面试:AI与大模型应用集成中的架构难题与解决方案-1

互联网大厂Java求职面试&#xff1a;AI与大模型应用集成中的架构难题与解决方案-1 场景描述 郑薪苦&#xff0c;一个看似不靠谱但技术潜力巨大的程序员&#xff0c;在一次针对AI与大模型应用集成的面试中&#xff0c;被一位技术总监级别的人物提问。面试官以严肃专业的态度&a…...

《算法笔记》13.2小节——专题扩展->树状数组(BIT) 问题 D: 数列-训练套题T10T3

数列(sequence.pas/c/cpp) - 问题描述 一个简单的数列问题&#xff1a;给定一个长度为n的数列&#xff0c;求这样的三个元素ai, aj, ak的个数&#xff0c;满足ai < aj > ak&#xff0c;且i < j < k。 - 输入数据 第一行是一个整数n(n < 50000)。 第二行n个整…...

一键启动多个 Chrome 实例并自动清理的 Bash 脚本分享!

目录 一、&#x1f4e6; 脚本功能概览 二、&#x1f4dc; 脚本代码一览 三、&#x1f50d; 脚本功能说明 &#xff08;一&#xff09;✅ 支持批量启动多个 Chrome 实例 &#xff08;二&#xff09;✅ 每个实例使用独立用户数据目录 &#xff08;三&#xff09;✅ 启动后自…...

4 月 62100 款 App 被谷歌下架!环比增长 28%

大家好&#xff0c;我是牢鹅&#xff01;上周刚刚结束的 2025 年 Google I/O 开发者大会&#xff0c; Google Play 带来了一系列的更新&#xff0c;主要围绕提升优质 App 的"发现"、"互动"和"收入"三大核心内容。 这或许正是谷歌生态的一个侧影…...

图像分割全路线学习(结合论文)

本篇文章参考自开源大佬的文章并结合自己的思考而来&#xff0c;欢迎大家提出意见&#xff0c;论文代码同样来自开源&#xff0c;文中已注明 文章目录 图像分割图像分割算法分类&#xff1f;传统的基于CNN的分割方法缺点&#xff1f;FCN详解FCN改变了什么?FCN网络结构&#x…...

Go语言之定义结构体(Struct)-《Go语言实战指南》

结构体&#xff08;struct&#xff09;是 Go 中的一种复合数据类型&#xff0c;它允许你将多个不同类型的字段组合成一个类型&#xff0c;类似于 C 语言的结构体或面向对象语言中的类。 一、结构体的基本定义 type 结构体名 struct {字段名 字段类型... } 示例&#xff1a; …...

mediapipe标注视频姿态关键点(基础版加进阶版)

前言 手语视频流的识别有两种大的分类&#xff0c;一种是直接将视频输入进网络&#xff0c;一种是识别了关键点之后再进入网络。所以这篇文章我就要来讲讲如何用mediapipe对手语视频进行关键点标注。 代码 需要直接使用代码的&#xff0c;我就放这里了。环境自己配置一下吧&…...

PCtoLCD2002如何制作6*8字符

如何不把“等比缩放”前的打勾取消&#xff0c;则无法修改为对应英文字符为6*8。 取消之后就可以更改了&#xff01;...

SmartPlayer与VLC播放RTMP:深度对比分析延迟、稳定性与功能

随着音视频直播技术的发展&#xff0c;RTMP&#xff08;实时消息传输协议&#xff09;成为了广泛应用于实时直播、在线教育、视频会议等领域的重要协议。为了确保优质的观看体验&#xff0c;RTMP播放器的选择至关重要。大牛直播SDK的SmartPlayer和VLC都是在行业中广受欢迎的播放…...

Qt QPaintEvent绘图事件painter使用指南

绘制需在paintEvent函数中实现 用图片形象理解 如果加了刷子再用笔就相当于用笔画过的区域用刷子走 防雷达&#xff1a; 源文件 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QPainter> Widget::Widget(QWidget…...

伪创新-《软件方法》全流程引领AI-第1章 04

《软件方法》全流程引领AI-第1章 ABCD工作流-01 对PlantUML们的评价-《软件方法》全流程引领AI-第1章 02 AI辅助的建模步骤-《软件方法》全流程引领AI-第1章 03 第1章 ABCD工作流 1.5 警惕和揭秘伪创新 初中数学里要学习全等三角形、相似三角形、SSS、SAS……&#xff0c;到…...

win11如何重启

在 Windows 11 中重启电脑有多种方法&#xff0c;以下是其中几种常见方法&#xff1a; 开始菜单重启&#xff1a; 点击屏幕左下角的“开始”按钮&#xff08;Windows 图标&#xff09;。 在开始菜单中&#xff0c;点击“电源”图标。 选择“重启”选项。 使用快捷键&#xf…...

【iOS】 锁

iOS 锁 文章目录 iOS 锁前言线程安全锁互斥锁pthread_mutexsynchronized (互斥递归锁)synchronized问题:小结 NSLockNSRecursiveLockNSConditionNSConditionLock 自旋锁OSSpinLock(已弃用)atomicatomic修饰的属性绝对安全吗?os_unfair_lock 读写锁互斥锁和自旋锁的对比 小结使…...

uni-app学习笔记十五-vue3页面生命周期(一)

页面生命周期概览 vue3页面生命周期如下图所示&#xff1a; onLoad 此时页面还未显示&#xff0c;没有开始进入的转场动画&#xff0c;页面dom还不存在。 所以这里不能直接操作dom&#xff08;可以修改data&#xff0c;因为vue框架会等待dom准备后再更新界面&#xff09;&am…...

Flink核心概念小结

文章目录 前言引言数据流API基于POJO的数据流基本源流配置示例基本流接收器数据管道与ETL(提取、转换、加载)一对一映射构建面向流映射的构建键控流进行分组运算RichFlatMapFunction对于流的状态管理连接流的使用流式分析水位的基本概念和示例侧道输入的基本概念和示例Process …...

《软件工程》第 14 章 - 持续集成

在软件工程的开发流程中&#xff0c;持续集成是保障代码质量与开发效率的关键环节。本章将围绕持续集成的各个方面展开详细讲解&#xff0c;结合 Java 代码示例与可视化图表&#xff0c;帮助读者深入理解并实践相关知识。 14.1 持续集成概述 14.1.1 持续集成的相关概念 持续集…...

大模型 Agent 中的通用 MCP 机制详解

1. 引言 大模型(Large Language Model,LLM)技术的迅猛发展催生了一类全新的应用范式:LLM Agent(大模型 Agent)。简单来说,Agent 是基于大模型的自治智能体,它不仅能理解和生成自然语言,还能通过调用工具与环境交互,从而自主地完成复杂任务。ChatGPT 的出现让人们看到…...

Navicat 17 SQL 预览时表名异常右键表名,点击设计表->SQL预览->另存为的SQL预览时,表名都是 Untitled。

&#x1f9d1;‍&#x1f4bb; 用户 Navicat 17 SQL 预览时表名异常右键表名&#xff0c;点击设计表->SQL预览->另存为的SQL预览时&#xff0c;表名都是 Untitled。 &#x1f9d1;‍&#x1f527; 官方技术中心 了解到您的问题&#xff0c;这个显示是正常的&#xff0c…...

Orpheus-TTS:AI文本转语音,免费好用的TTS系统

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、Orpheus-TTS&#xff1a;重新定义语音合成的标准1. 什么是Orpheus-TTS&#xff…...

Python爬虫实战:研究Goose框架相关技术

一、引言 随着互联网的迅速发展,网络上的信息量呈爆炸式增长。从海量的网页中提取有价值的信息成为一项重要的技术。网络爬虫作为一种自动获取网页内容的程序,在信息收集、数据挖掘、搜索引擎等领域有着广泛的应用。本文将详细介绍如何使用 Python 的 Goose 框架构建一个完整…...

webpack优化方法

以下是Webpack优化的系统性策略&#xff0c;涵盖构建速度、输出体积、缓存优化等多个维度&#xff0c;配置示例和原理分析&#xff1a; 一、构建速度优化 1. 缩小文件搜索范围 module.exports {resolve: {// 明确第三方模块的路径modules: [path.resolve(node_modules)],// …...