LeetCode Python - 40.组合总和②

目录

  • 题目
  • 答案
  • 运行结果


题目

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

提示:

  • 1 <= candidates.length <= 100
  • 1 <= candidates[i] <= 50
  • 1 <= target <= 30

答案

我们可以先对数组进行排序,方便剪枝以及跳过重复的数字。

接下来,我们设计一个函数 dfs(i,s),表示从下标 i 开始搜索,且剩余目标值为 s,其中 i 和 s 都是非负整数,当前搜索路径为 t,答案为 ans。

在函数 dfs(i,s) 中,我们先判断 s 是否为 0,如果是,则将当前搜索路径 t 加入答案 ans 中,然后返回。如果 i≥n,或者 s<candidates[i],说明当前路径不合法,直接返回。否则,我们从下标 i 开始搜索,搜索的下标范围是 j∈[i,n),其中 n 为数组 candidates 的长度。在搜索的过程中,如果 j>i 并且
candidates[j]=candidates[j−1],说明当前数字与上一个数字相同,我们可以跳过当前数字,因为上一个数字已经搜索过了。否则,我们将当前数字加入搜索路径 t 中,然后递归调用函数 dfs(j+1,s−candidates[j]),然后将当前数字从搜索路径 t 中移除。

我们也可以将函数 dfs(i,s) 的实现逻辑改为另一种写法。如果我们选择当前数字,那么我们将当前数字加入搜索路径 t 中,然后递归调用函数 dfs(i+1,s−candidates[i]),然后将当前数字从搜索路径
t 中移除。如果我们不选择当前数字,那么我们可以跳过与当前数字相同的所有数字,然后递归调用函数 dfs(j,s),其中 j 为第一个与当前数字不同的数字的下标。

在主函数中,我们只要调用函数 dfs(0,target),即可得到答案。

时间复杂度 O(2 n ×n),空间复杂度 O(n)。其中 n 为数组 candidates 的长度。由于剪枝,实际的时间复杂度要远小于
O(2 n ×n)。

class Solution(object):def combinationSum2(self, candidates, target):""":type candidates: List[int]:type target: int:rtype: List[List[int]]"""def dfs(i, s):if s == 0:ans.append(t[:])returnif i >= len(candidates) or s < candidates[i]:returnfor j in range(i, len(candidates)):if j > i and candidates[j] == candidates[j - 1]:continuet.append(candidates[j])dfs(j + 1, s - candidates[j])t.pop()candidates.sort()ans = []t = []dfs(0, target)return ans
class Solution(object):def combinationSum2(self, candidates, target):""":type candidates: List[int]:type target: int:rtype: List[List[int]]"""def dfs(i, s):if s == 0:ans.append(t[:])returnif i >= len(candidates) or s < candidates[i]:returnx = candidates[i]t.append(x)dfs(i + 1, s - x)t.pop()while i < len(candidates) and candidates[i] == x:i += 1dfs(i, s)candidates.sort()ans = []t = []dfs(0, target)return ans

运行结果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

直流负载原理与应用

直流负载是指能够消耗直流电能的设备或系统&#xff0c;在电力系统中&#xff0c;直流负载主要包括直流电动机、蓄电池、电解槽等。这些设备在运行过程中需要消耗大量的直流电能&#xff0c;因此对直流电源的稳定性和可靠性要求较高。本文将对直流负载的原理及其应用进行简要介…

如何实现class文件的反编译:java-decompiler 反编译工具

java-decompiler 反编译工具 &#x1f600; Java Decompiler 是Java反编译工具&#xff0c;可以对 Java 5 和更高版本的 class 文件进行反编译分析。 &#x1f4dd; 主旨内容 Java Decompiler是一项开源工具&#xff0c;Java Decompiler工具不仅可以实现反编译.class文件&…

【Azure 架构师学习笔记】- Azure Private Endpoint

本文属于【Azure 架构师学习笔记】系列。 前言 公有云的其中一个特点是默认允许公网访问&#xff0c; 这就对企业环境带来风险&#xff0c;也是很多年前企业对公有云抵触的其中一个原因&#xff0c;现在这类问题已经很少&#xff0c;因为有了很多技术来确保云上的资源被安全地…

基于docker安装的Jenkins实现python执行自动化测试程序

背景 通过Jenkins实现自动化测试,在全局配置中配置好后,执行构建发生如下错误 解决办法: 在Jenkins中插件管理中下载python后,回到Jenkins容器中 查找刚下载的python所在位置 到Jenkins中全局配置中修改脚本 1.可以在环境变量中定义python所在位置 2.在一下图示中进行获取…

IM聊天交友APP源码IM带音视频Uniapp即时通讯安卓苹果APP修改二开

前端开发语言&#xff1a;VUE&#xff08; 安卓&#xff0c;IOS,WEB为一套前端代码&#xff09; 服务器端开发语言: PHPWebSocket 数据库&#xff1a;MySql mongodb 前端打包工具&#xff1a;Hbuilder 服务器搭建工具&#xff1a;宝塔 Xshell 短信接口&#xff1a; 支持…

机器学习笔记 DeepFakes和换脸技术简述

一、简述 人脸检测一直是 2000 年代初的主要研究课题。差不多二十年后,这个问题基本上得到了解决,并且人脸检测在大多数编程语言中都可以作为库使用。甚至换脸技术也不是什么新鲜事,并且已经存在了好些年了。 早在2016年左右就有基于OpenCV进行面部交换的方式了,主要是基于…

【Python数据分析系列】一文带你认识pd.DataFrame的组成(案例)

这是我的第233篇原创文章。 一、引言 DataFrame是Pandas库中的一个重要数据结构&#xff0c;它类似于电子表格或数据库表。DataFrame是一个二维的、大小可变的表格数据结构&#xff0c;其中数据以行和列的形式排列。每一列可以是不同的数据类型&#xff08;整数、浮点数、字符…

2024选哪个牌子的大路灯好用又实惠?口碑最好的五款大路灯品牌型号推荐!

近年来&#xff0c;随着科技时代的迅速发展&#xff0c;大路灯作为一种能够帮助改善光线环境的家电备受追捧&#xff0c;大家都会给自己和家里孩子备上一款大路灯&#xff0c;在读写、工作的时候开大路灯能够充分明亮的照明。然而&#xff0c;市场上存在许多不专业的产品&#…

Bytebase 签约合思,覆盖多云数据库变更发布,数据访问控制,安全治理的全生命周期,确保符合合规审计要求

在数字化快速发展时代&#xff0c;有效的规范数据库管理对企业安全运营至关重要。近日&#xff0c;数据库 DevOps 团队协同管理工具 Bytebase 签约费控领域领军企业合思&#xff0c;旨在全面优化数据库操作管理&#xff0c;收口全体员工的变更和查询操作&#xff0c;以提高整体…

【Git】解决上传代码到github不增加代码提交次数问题

问题 在我们向github远程仓库中提交代码时&#xff0c;有时候会出现提交了代码却没有显示代码的提交记录问题。这是因为你远程github的用户信息和你本地仓库用户信息不一致造成的。 解决 查看本地仓库用户信息 git config --global -l查看哪一项用户信息与你github上不同。…

如何转行成为产品经理?

转行NPDP也是很合适的一条发展路径&#xff0c;之后从事新产品开发相关工作~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff…

[c++] c++ 中的顺序(构造,析构,初始化列表,继承)

对象构造的时候&#xff0c;对象成员变量的初始化顺序是什么样的 &#xff1f; 派生类构造的时候&#xff0c;先构造基类还是先构造派生类 &#xff1f; 构造函数中的初始化列表&#xff0c;初始化的顺序是列表的顺序吗 &#xff1f; 析构的时候&#xff0c;析构的顺序是什么…