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

news2024/9/23 15:22:06

文章目录

  • 一、题目
  • 二、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

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

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

相关文章

/etc/init.d/functions: Syntax error: “(“ unexpected (expecting “done“)

一.问题描述&#xff1a; ubuntu系统安装服务时报错&#xff1a; 二.问题解析&#xff1a; Ubuntu安装时默认使用dash&#xff0c;shell脚本命令失败&#xff0c;需要安装bash来运行&#xff0c;长期解决该问题就是重新配置dash 三:问题解决&#xff1a; sudo dpkg-reconfi…

迅为龙芯2K1000开发板虚拟机ubuntu启动root用户

作为嵌入式开发人员&#xff0c;系统的所有权限都要为我们打开&#xff0c;所以我们不必像运维那样&#xff0c;对 root 用户非常敏感&#xff0c;所以安装完 ubuntu 系统以后&#xff0c;我们要启用 root 用户。 首先我们打开 ubuntu 控制终端&#xff0c;然后在终端里面输入…

wireshark抓包并进行Eigrp网络协议分析

路由协议 Eigrp ​ EIGRP:Enhanced Interior Gateway Routing Protocol 即 增强内部网关路由协议。也翻译为 加强型内部网关路由协议。 EIGRP是Cisco公司的私有协议&#xff08;2013年已经公有化&#xff09;。 EIGRP结合了链路状态和距离矢量型路由选择协议的Cisco专用协议&a…

银行数据中心机房动力环境监控系统设计与优化

安科瑞电气股份有限公司 上海嘉定201801 摘要&#xff1a;结合银行数据中心建设项目&#xff0c;设计银行数据中心机房动力环境监控系统&#xff0c;分析银行数据中心机房监控对象、搭建系统监控架构&#xff0c;给出监控实现方法&#xff0c;*后针对运行一段时间出现的问题&a…

关于淘宝API接口你必须了解的API2.0

据说API从1.0升级到2.0啦&#xff1f;今天我们来聊一聊关于淘宝API接口你必须了解的API2.0 然而 作为新手小白 …… 并不懂API是毛线 好吧 …… 今天 我们就来上一堂小白入门课 几句话聊聊API 高级淘客 请忽略 请批评 请交流 还有请看到最底下 有重磅消息&#xf…

人大女王金融硕士毕业生:追风而遇、沐光同行;心羽为翼,不负韶华!

中国人民大学-加拿大女王大学金融硕士2022-2023级行业高管班 新加坡大东方人寿北京代表处首席代表 01、社会发展推动金融业持续迭代&#xff0c;为更好应对未来挑战&#xff0c;持续学习和自我升级非常重要&#xff01; 2015年以来&#xff0c;新一代数字化和智能化信息技术…

halcon获取轮廓属性的时候报错:Contour attribute not defined(HALCON错误代码:3261)

报错截图&#xff1a; 在使用以下算子&#xff0c;获取xld的distance属性时&#xff0c;或者其他属性时报错。 get_contour_attrib_xld (ObjectSelected, distance, Attrib) 如果是属性报错。这里需要在调用获取轮廓属性之前先获得轮廓之间的距离。 使用以下算子&#xff1a;…

如何构建可视化设计中的视觉层次?

【什么是视觉层次感】 第一层级&#xff1a;主导元素&#xff0c;即最重要的视觉信息。能够很清晰的传达最重要的信息&#xff0c;你的主导层级通常由图形或者重要的视觉原色组成&#xff1b; 第二层级&#xff1a;应该是数据焦点&#xff0c;引导用户查看重要的数据指标&…

解决@Autowired警告

一.前言 再使用springboot自动注入Autowired注解时,下方会出现波浪线警告,这是什么原因呢?我们细看提示说明已经说的很清楚了,Field injection is not recommended “不建议使用字段注入”,字段注入是指通过直接将依赖项注入到类的字段中来实现依赖注入。这种方式存在一些问题…

网易数帆:云原生向左,低代码向右

网易数帆&#xff0c;前身是网易杭州研究院于2016年孵化的网易云&#xff0c;历经7载探索与沉淀&#xff0c;如今已进化成为覆盖云原生、低代码、大数据和人工智能四大技术赛道的数智化服务提供商&#xff0c;服务于金融、央国企、能源、制造等领域300余家头部企业。 近日&…

『亚马逊云科技产品测评』活动征文|Amazon EC2 的讲解及相关服务

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 Amazon EC2 的讲解及相关服务 一、什么是 Amazon EC2&#xff1f;二、何为…

centos7 安装网络文件共享NFS详细过程

网络文件系统&#xff0c;英文Network File System(NFS)&#xff0c;是由SUN公司研制的UNIX表示层协议(presentation layer protocol)&#xff0c;能使使用者访问网络上别处的文件就像在使用自己的计算机一样。 多个服务器之间需要共享文件&#xff0c;通过NFS服务共享是一个简…

“咸阳杯·美洲队中国行”国际足球邀请赛圆满举办

巴拿马1:0乌拉圭 “咸阳杯美洲队中国行”国际足球邀请赛圆满举办 11月12日下午3&#xff1a;00&#xff0c;由陕旅集团联合承办、陕体集团协办的“咸阳杯美洲队中国行”国际足球邀请赛在咸阳奥体中心开赛。两支美洲劲旅&#xff1a;巴拿马国家队与乌拉圭国青队龙争虎斗&#…

基于springboot实现生鲜超市管理的设计与实现系统【项目源码】计算机毕业设计

基于springboot实现生鲜超市管理的设计与实现系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群…

AlNiCo铝镍钴永磁材料

1970年代稀土永磁材料发明之前&#xff0c;AlNiCo铝镍钴合金一直是磁性能最强的永磁材料&#xff0c;不过由于成分中包含战略性金属钴和镍&#xff0c;导致成本较高&#xff0c;随着铁氧体永磁和稀土永磁的相继问世&#xff0c;铝镍钴材料在众多应用中逐步被取代。但在一些高温…

屏幕截图软件 Snagit mac中文版软件特点

Snagit mac是一款屏幕截图和视频录制软件&#xff0c;它可以帮助用户快速捕捉屏幕上的任何内容&#xff0c;并将其编辑、标注和共享。 Snagit mac软件特点 多种截图模式&#xff1a;支持全屏截图、窗口截图、区域截图、延时截图等多种截图模式&#xff0c;满足不同用户的需求。…

求求了 谁好人家还搞托运!!

求求了 谁好人家还搞托运!! 真相了 是我这个好人 转眼又是一年之冬 北方的朋友已经开始“南迁”了 或者在北方生长的宝子也会不习惯冬天吗? 你又是来自哪个城市呢? 所以过冬这件事情不容小觑 而中国唯一的热带气候省份-海南 就成了香饽饽 但有个问题令人犯愁 北方来到中国最南…

(论文阅读26/100)Weakly-supervised learning with convolutional neural networks

26.文献阅读笔记 简介 题目 Weakly-supervised learning with convolutional neural networks 作者 Maxime Oquab&#xff0c;Leon Bottou&#xff0c;Ivan Laptev&#xff0c;Josef Sivic&#xff0c;CVPR&#xff0c;2015 原文链接 http://www.cv-foundation.org/open…

[SOC] MBIST (Memory Built-In Self Test) and Memory Built-in Self Repair (BISR)

存储器构成了 VLSI 电路的很大一部分。存储系统设计的目的 是存储大量数据。[1] 存储器不包括逻辑门和触发器。因此&#xff0c;需要不同的故障模型和测试算法来测试存储器。 MBIST 是一种自测试和修复机制&#xff0c;它通过一组有效的算法来测试存储器&#xff0c;以检测典型…

Lightroom Classic 2023 v12.4

Lightroom Classic 2023是一款图像处理软件&#xff0c;是数字摄影后期制作的重要工具之一。与其他图像处理软件相比&#xff0c;Lightroom Classic具有以下特点&#xff1a; 高效的图像管理&#xff1a;Lightroom Classic提供了强大的图像管理功能&#xff0c;可以轻松导入、…