【算法与数据结构】40、LeetCode组合总和 II

news2024/11/29 12:54:30

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

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

一、题目

在这里插入图片描述

二、解法

  思路分析:【算法与数据结构】39、LeetCode组合总和的基础之上,这道题变成了candidates中有重复元素,而且每个元素只能使用一次。如果直接使用39题的代码会出现重复的组合,需要去重,但这样一来leetcode可能运行超时。因此我们需要再找组合的时候就进行去重的操作。引入一个used布尔数组,标记candidates中的元素是否使用过。在这之前首先需要对candidates数组进行排序。

  例如, target=7, candidates = [1 1 2 4 5 7], 第一种情况:candidates[0] +candidates[2] + candidates[3] = candidates[1] +candidates[2] + candidates[3]= 1 + 2 + 4, 因此出现重复的组合。第二种情况:candidates[0] +candidates[1] + candidates[4]= 1 + 1 + 5是无重复的组合。因此用used标记使用过的数,当candidates[i] == candidates[i - 1]时,出现重复元素。进行第i次循环时,第一种情况used[i-1]=false就是出现重复组合, 在第i-1次循环时已经考虑过了,直接continue。第二种情况就是重复数字都利用到了used[i-1]=true,这种需要考虑。
  程序如下

class Solution {
private:
	vector<vector<int>> result;     // 结果合集
	vector<int> path;
	
	void backtracking(const vector<int>& candidates, const int target, int sum, int startIndex, vector<bool>& used) {
		if (sum > target) return;    // 剪枝
		if (sum == target) {
			result.push_back(path);
			return;
		}
		for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) { // 剪枝优化
			if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {	// 去重
				continue; 
			}
			sum += candidates[i];
			used[i] = true;
			path.push_back(candidates[i]);  // 处理节点
			backtracking(candidates, target, sum, i+1, used);  // 递归
			used[i] = false;
			sum -= candidates[i];
			path.pop_back();    // 回溯,撤销处理的节点
		}
	}
public:
	vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
		vector<bool>used(candidates.size(), 0);
		sort(candidates.begin(), candidates.end());
		backtracking(candidates, target, 0, 0, used);
		return result;
	}
};

复杂度分析:

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

三、完整代码

# include <iostream>
# include <vector>
# include <string>
# include <algorithm>
using namespace std;

class Solution {
private:
	vector<vector<int>> result;     // 结果合集
	vector<int> path;
	
	void backtracking(const vector<int>& candidates, const int target, int sum, int startIndex, vector<bool>& used) {
		if (sum > target) return;    // 剪枝
		if (sum == target) {
			result.push_back(path);
			return;
		}
		for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) { // 剪枝优化
			if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {	// 去重
				continue; 
			}
			sum += candidates[i];
			used[i] = true;
			path.push_back(candidates[i]);  // 处理节点
			backtracking(candidates, target, sum, i+1, used);  // 递归
			used[i] = false;
			sum -= candidates[i];
			path.pop_back();    // 回溯,撤销处理的节点
		}
	}
public:
	vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
		vector<bool>used(candidates.size(), 0);
		sort(candidates.begin(), candidates.end());
		backtracking(candidates, target, 0, 0, used);
		return result;
	}
};

int main() {
	vector<int> candidates = { 10,1,2,7,6,1,5 };
	int target = 8;
	Solution s1;
	vector<vector<int>> result = s1.combinationSum2(candidates, target);
	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/1192055.html

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

相关文章

Bytebase 2.11.0 - 支持 OceanBase Oracle 模式

&#x1f680; 新功能 支持 OceanBase Oracle 模式。支持设置 MySQL 在线变更参数。新增项目数据库查看者的角色。 &#x1f384; 改进 支持在项目中直接选择所有用户并为之添加角色。 调整了项目页面的布局。在 SQL 编辑器中通过悬浮面板展示表和列的详情。 &#x1faa6; …

弹性布局display:flex

弹性布局display:flex 一、弹性布局的特点二、容器的属性1、justify-content1.1 justify-content: center 居中1.2 justify-content: flex-start&#xff08;默认值&#xff09;&#xff1a;左对齐1.3 justify-content: flex-end 右对齐1.4 justify-content:space-between 两端…

第四季度净利润扭亏为盈,迪士尼的流媒体终于成功了?

对于一直关注迪士尼的投资者来说&#xff0c;眼下最关心的问题只有一个——迪士尼转行流媒体成功了吗&#xff1f; 而对于这一问题答案&#xff0c;或许可以从迪士尼最新发布的财报中找到。11月9日&#xff0c;华特迪士尼公布了截至2023年9月30日的第四季度和全年收益。其中&a…

大厂面试题-什么是聚集索引和非聚集索引

1.简单来说&#xff0c;聚集索引就是基于主键创建的索引&#xff0c;除了主键索引以外的其他索引&#xff0c;称为非聚集索引&#xff0c;也叫做二级索引。 2.由于在InnoDB引擎里面&#xff0c;一张表的数据对应的物理文件本身就是按照B树来组织的一种索引结构&#xff0c;而聚…

图论10-哈密尔顿回路和哈密尔顿路径+状态压缩+记忆化搜索

文章目录 1 哈密尔顿回路2 哈密尔顿回路算法实现2.1 常规回溯算法2.2 引入变量记录剩余未访问的节点数量 3 哈密尔顿路径问题4 状态压缩4.1 查看第i位是否为14.2 设置第i位是为1或者04.3 小结4.4 状态压缩在哈密尔顿问题中的应用 5 记忆化搜索5.1 记忆化搜索与递推区别5.2 记忆…

洛谷 Equalize the Remainders

洛谷没提供中文题面&#xff0c;这里大致翻译一下&#xff1a; 可以进行的操作&#xff1a;任选一个数加一。 一共有n个整数&#xff0c;还有一个约数m&#xff0c;n个数都对m进行求余&#xff0c;累计余数的数量&#xff0c;要求每个余数都有n/m个。 对于样例1的输入&#xff…

Windows系统下本地MQTT服务器搭建(保姆级教程)

Windows系统下本地MQTT服务器搭建 1.下载并安装emqx服务器 1. 访问Eqmx官网 2. 选中合适的MQTT服务器版本 由于我们使用的是本地部署MQTT服务器&#xff0c;而且只使用基础功能的MQTT服务器功能&#xff0c;所以选中“大规模分布式MQTT消息服务器”即可&#xff0c;如下如图…

构建全面预算体系,加强企业风险管理

全面预算管理体系是帮助企业实现其战略目标的重要手段。随着预算管理理念备受重视&#xff0c;这种新型的企业管理模式通过高效科学的方式和工具&#xff0c;在我国新时代背景下&#xff0c;逐渐成为了企业经营运作过程中针对挑战的有效措施。通常情况下&#xff0c;企业将全面…

docker搭建mysql主从复制

1. 基础环境 环境 名称描述CentOS 7.6Linux操作系统版本docker 20.10.5docker版本mysql 8.0.29mysql镜像版本 节点 节点名称读写/主从地址端口master读节点/主节点192.168.1.6:3306slave1写节点/从节点192.168.1.6:3307slave2写节点/从节点192.168.1.6:3308 2. 主节点 使…

Lightroom Classic 2021 v10.4

Lightroom Classic 2021是一款一体化照片管理和编辑解决方案。 它面向专业人士和高端用户&#xff0c;支持各种不同相机的原始图像编辑&#xff0c;包括Canon、Apple、Casio、Contax、DxO、Epson等品牌。这样可以将原图像快速导入进行编辑&#xff0c;轻松满足不同用户的需求。…

将 Ordinals 与比特币智能合约集成:第 4 部分

控制 BSV-20 代币的分配 在上一篇文章中&#xff0c;我们展示了智能合约可以在铸造后控制 BSV-20 代币的转移。 今天&#xff0c;我们演示如何控制此类代币的分发/发行。 无Tick模式 BSV-20 在 V2 中引入了无Tick模式&#xff0c;并采用了与 V1 不同的方法。 部署 (Deploy) …

大厂面试题-MySQL为什么使用B+Tree作为索引结构

从几个方面来回答&#xff1a; 首先&#xff0c;常规的数据库存储引擎&#xff0c;一般都是采用B树或者B树来实现索引的存储。 (如图)因为B树是一种多路平衡树&#xff0c;用这种存储结构来存储大量数据&#xff0c;它的整个高度会相比二叉树来说&#xff0c;会矮很多。 而对…

【论文阅读】NeROIC:在线图像集合中对象的神经渲染

论文连接&#xff1a; NeROIC: Neural Rendering of Objects from Online Image Collections introduction 从在线图像集合中获取对象表示的新颖方法&#xff0c;从具有不同相机、照明和背景的照片中捕获任意对象的高质量几何形状和材料属性。这使得各种以对象为中心的渲染应…

AI:78-基于深度学习的食物识别与营养分析

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

ssm+vue的疫情防控管理系统设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的疫情防控管理系统设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网…

【AI】生成模型变得简单:了解它们的工作原理和不同类型

什么是生成模型&#xff1f; 在不断发展的人工智能领域&#xff0c;生成模型已成为人工智能技术最具吸引力和创造力的方面之一。这些模型是创意人工智能的核心&#xff0c;它们有能力生成各种内容&#xff0c;从栩栩如生的图像和引人入胜的文本到令人着迷的音乐和创新的艺术作…

webpack babel

构建工具 简介 当我们习惯了在node中编写代码的方式后&#xff0c;在回到前端编写html、css、js这些东西会感觉到各种的不便。比如&#xff1a;不能放心的使用模块化规范&#xff08;浏览器兼容性问题&#xff09;、即使可以使用模块化规范也会面临模块过多时的加载问题。我们…

MySQL字符串需要注意的事项

char(N)&#xff0c;N在0-255间 varchar(N)&#xff0c;N在0-65536间 需要注意N是字符&#xff0c;不是字节&#xff0c;英文字母一个字符一个字节&#xff0c;阿拉伯字母一个字符两个字节&#xff0c;中文日文一个字符三个字节&#xff0c;emoji是一个字符四个字节 当今移动端…

跨境电商:自养买家账号测评,你需要了解的细节

在跨境电商的浪潮中&#xff0c;自养买家账号测评已经成为了一种趋势。近期&#xff0c;不少跨境卖家咨询自养买家账号测评的相关问题&#xff0c;看来有必要再讲解一下卖家测评的一些细节。今天将着重介绍自养号测评的相关内容。 首先&#xff0c;什么叫做自养号测评呢&#x…

创建云端服务器

1.申请云端服务器 每个账户有三个月的免费试用 我的服务器选择是centos7 &#xff0c;别选成win了。 2.创建实例 创建实例的步骤&#xff0c;阿里云有文档 介绍 大致就是 左边点实例 -》 顶部选你申请服务器时的地区-》下面就出现一条实例-》点更多 -》要重置实例密码 -》同一…