【算法与数据结构】78、90、LeetCode子集I, II

文章目录

  • 一、题目
  • 二、78.子集
  • 三、90.子集II
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述
在这里插入图片描述

二、78.子集

  思路分析:【算法与数据结构】77、LeetCode组合。本题可以参考77题的组合问题代码,稍加修改即可。本质上还是回溯的三部曲:处理节点、递归、回溯。不过集合问题的k是不固定的,因此每次循环都需要把path的结果加入result中。
  程序如下

class Solution {
private:
	vector<vector<int>> result;
	vector<int> path;
	void backtracking(const vector<int>& nums, int startIndex) {
		for (int i = startIndex; i < nums.size(); i++) {
			path.push_back(nums[i]);	// 处理节点
			result.push_back(path);
			backtracking(nums, i + 1);	// 递归
			path.pop_back();			// 回溯
		}
	}
public:
	vector<vector<int>> subsets(vector<int>& nums) {
		backtracking(nums, 0);
		result.push_back({});	// 空集
		return result;
	}
};

  进一步的,可以将添加空集的那行代码一起添加到回溯函数当中;

class Solution {
private:
	vector<vector<int>> result;
	vector<int> path;
	void backtracking(const vector<int>& nums, int startIndex) {
		result.push_back(path);
		for (int i = startIndex; i < nums.size(); i++) {
			path.push_back(nums[i]);	// 处理节点			
			backtracking(nums, i + 1);	// 递归
			path.pop_back();			// 回溯
		}
	}
public:
	vector<vector<int>> subsets(vector<int>& nums) {
		backtracking(nums, 0);
		return result;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n)
  • 空间复杂度: O ( n ) O(n) O(n)

三、90.子集II

  思路分析:【算法与数据结构】40、LeetCode组合总和 II本题解法可以采用和这道题一直的思路,引入一个used数组进行去重。

class Solution {
private:
	vector<vector<int>> result;
	vector<int> path;	
	void backtracking(const vector<int>& nums, int startIndex, vector<bool>& used) {
		result.push_back(path);		
		for (int i = startIndex; i < nums.size(); i++) {
			if (i > 0 && nums[i] == nums[i - 1] && used[i-1] == 0) {
				continue;		
			}
			path.push_back(nums[i]);	// 处理节点	
			used[i] = true;
			backtracking(nums, i + 1, used);	// 递归
			used[i] = false;
			path.pop_back();			// 回溯
		}
	}
public:
	vector<vector<int>> subsetsWithDup(vector<int>& nums) {
		vector<bool> used(nums.size(), 0);
		sort(nums.begin(), nums.end());
		backtracking(nums, 0, used);
		return result;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

// 78子集问题
# include <iostream>
# include <string>
# include <vector>
using namespace std;

class Solution {
private:
	vector<vector<int>> result;
	vector<int> path;
	void backtracking(const vector<int>& nums, int startIndex) {
		result.push_back(path);
		for (int i = startIndex; i < nums.size(); i++) {
			path.push_back(nums[i]);	// 处理节点			
			backtracking(nums, i + 1);	// 递归
			path.pop_back();			// 回溯
		}
	}
public:
	vector<vector<int>> subsets(vector<int>& nums) {
		backtracking(nums, 0);
		return result;
	}
};

int main() {
	Solution s1;
	vector<int> nums = { 1, 2, 3 };
	vector<vector<int>> result = s1.subsets(nums);
	for (vector<vector<int>>::iterator it = result.begin(); it != result.end(); it++) {
		for (vector<int>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {
			cout << *jt << " ";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}
// 90子集II问题
# include <iostream>
# include <string>
# include <vector>
# include <algorithm>
using namespace std;

class Solution {
private:
	vector<vector<int>> result;
	vector<int> path;	
	void backtracking(const vector<int>& nums, int startIndex, vector<bool>& used) {
		result.push_back(path);		
		for (int i = startIndex; i < nums.size(); i++) {
			if (i > 0 && nums[i] == nums[i - 1] && used[i-1] == 0) {
				continue;		
			}
			path.push_back(nums[i]);	// 处理节点	
			used[i] = true;
			backtracking(nums, i + 1, used);	// 递归
			used[i] = false;
			path.pop_back();			// 回溯
		}
	}
public:
	vector<vector<int>> subsetsWithDup(vector<int>& nums) {
		vector<bool> used(nums.size(), 0);
		sort(nums.begin(), nums.end());
		backtracking(nums, 0, used);
		return result;
	}
};

int main() {
	Solution s1;
	vector<int> nums = { 1, 2, 2 };
	vector<vector<int>> result = s1.subsetsWithDup(nums);
	for (vector<vector<int>>::iterator it = result.begin(); it != result.end(); it++) {
		for (vector<int>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {
			cout << *jt << " ";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由器的结构以及工作原理

目录 路由器的结构 交换结构三种常用的交换方式 1.通过存储器 2.通过总线 3.通过纵横交换结构&#xff08;crossbar switch fabric&#xff09; 路由器的结构 路由器结构可划分为两大部分&#xff1a;路由选择部分&#xff0c;分组转发部分 路由选择部分也叫做控制部分&…

java高并发系列-第2天:并发级别

这是java高并发系列第2篇文章&#xff0c;一个月&#xff0c;咱们一起啃下java高并发&#xff0c;欢迎留言打卡&#xff0c;一起坚持一个月&#xff0c;拿下java高并发。 由于临界区的存在&#xff0c;多线程之间的并发必须受到控制。根据控制并发的策略&#xff0c;我们可以把…

P6入门:项目初始化7-项目详情之代码/分类码Code

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值&#xff0c;通过遍历数列&#xff0c;将数列分成两个子数列&#xff1a;小于基准值数列、大于基准值数列&#xff0c;准确来说还有个子数列&#xff1a;等于基准值即&#xff1a; 算法图解 选出基准元素pivot&#xff08;可以选择…

P36[11-1]SPI通信协议

SPI相比于IIC的优缺点: 1.SPI传输速度快(IIC高电平驱动能力较弱,因此无法高速传输) 2.使用简单 3.通信线多 SCK(SCLK,CK,CLK):串行时钟线 MOSI(DO):主机输出,从机输入 MISO(DI): 主机输入,从机输出 SS(NSS,CS):从机选择(有多少个从机,主机就要用几根SS分别与从机连接…

Windows环境下ADB调试——安装adb

一、下载 Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zipMac版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-darwin.zipLinux版本&#xff1a;https://dl.google.com/android/reposit…

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS&#xff0c;这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…

专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战

前言 OpenTiny 开源之夏项目终于迎来了圆满的结局。借此机会&#xff0c;我们采访了 TinyReact 的共建者 Mr 栋同学。 Mr 栋同学是一位热衷于前端技术的开发者&#xff0c;对前端开发充满了激情和热爱。同时他也是一位即将毕业的大四在校生。在 OpenTiny 开源项目中&#xff0…

Java18新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17 的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java…

做一个Sprngboot文件上传-阿里云

概述 这个模块是用来上传头像以及文章封面的&#xff0c;图片的值是一个地址字符串&#xff0c;一般存放在本地或阿里云服务中 1、本地文件上传 我们将文件保存在一个本地的文件夹下&#xff0c;由于可能两个人上传不同图片但是却同名的图片&#xff0c;那么就会一个人的图片就…

Mac 本地部署thinkphp8【部署环境以及下载thinkphp】

PHP的安装以及环境变量配置 1 PHP安装&#xff1a;在终端输入brew install php 这里是PHP下载的最新的 如果提示‘brew’找不到&#xff0c;自己搜索安装吧&#xff0c; 不是特别难 2 环境变量配置 终端输入vim ~/.bash_profile 输入export PATH"/usr/local/Cellar/php/8.…

ubuntu18.04安装google浏览器

下载google安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 安装google浏览器 sudo dpkg -i google-chrome-stable_current_amd64.deb 执行安装 sudo apt-get -f install 启动浏览器 在应用程序中找到google图标点击运行

安全区域边界(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1边界防护 1.1应保证跨…

Spark数据倾斜优化

1 数据倾斜现象 1、现象 绝大多数task任务运行速度很快&#xff0c;但是就是有那么几个task任务运行极其缓慢&#xff0c;慢慢的可能就接着报内存溢出的问题。 2、原因 数据倾斜一般是发生在shuffle类的算子&#xff0c;比如distinct、groupByKey、reduceByKey、aggregateByKey…

vue脚手架初始化项目搭建后配置路由【小白易学】

首先这里你已经创建好项目了&#xff0c;这是跑起来的效果 首先第一步&#xff0c;需要下载路由router npm install vue-router4下载好了之后找到main.js页面,加入router import { createApp } from vue; import App from ./App.vue; import router from ./routercreateApp(A…

采集标准Docker容器日志:部署阿里云Logtail容器以及创建Logtail配置,用于采集标准Docker容器日志

文章目录 引言I 预备知识1.1 LogtailII 查询语法2.1 具体查询语法2.2 查询示例2.3 设置token时间(登录过期时间)see also引言 I 预备知识 1.1 Logtail Logtail是日志服务提供的日志采集Agent,用于采集阿里云ECS、自建IDC、其他云厂商等服务器上的日志。本文介绍Logtail的功…

RTOS实时操作系统在嵌入式开发中的应用

随着各种嵌入式系统应用的日益复杂和对实时性要求的提高&#xff0c;使用实时操作系统&#xff08;RTOS&#xff09;成为嵌入式开发中的一种重要选择。STM32微控制器作为一种强大的嵌入式处理器&#xff0c;与各种RTOS相结合&#xff0c;能够提供更高效、可靠并且易于维护的系统…

ESP32网络开发实例-BME280传感器数据保存到InfluxDB时序数据库

BME280传感器数据保存到InfluxDB时序数据库 文章目录 BME280传感器数据保存到InfluxDB时序数据库1、BM280和InfluxDB介绍2、软件准备3、硬件准备4、代码实现在本文中,将详细介绍如何将BME280传感器数据上传到InfluxDB中,方便后期数据处理。 1、BM280和InfluxDB介绍 InfluxDB…

postgreSQL中的高速缓存

1. 高速缓存简介 ​如下图所示&#xff0c;当一个postgreSQL进程读取一个元组时&#xff0c;需要获取表的基本信息&#xff08;例如&#xff1a;表的oid、索引信息和统计信息等&#xff09;及元组的模式信息&#xff0c;这些信息被分别记录在多个系统表中。通常一个表的模式信…

果园自主跟随碎枝机器人

开发背景 农业扶贫项目—— 开发一款适用于猕猴桃果园的跟随碎枝机器人。 在猕猴桃的种植培育过程中&#xff0c;一项非常重要的环节便是剪枝&#xff0c;通常有冬剪和夏剪。以往果农剪完枝条后要将散落于地的枝条归拢后统一粉碎还田。这需要专门收集地面上的枝条并将其归拢到…