39. 组合总和 40. 组合总和 II

2023-11-04

39. 组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

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

示例 3:

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

搜索回溯

时间复杂度:O(S),**其中 S 为所有可行解的长度之和。从分析给出的搜索树我们可以看出时间复杂度取决于搜索树所有叶子节点的深度之和,即所有可行解的长度之和。**在这题中,我们很难给出一个比较紧的上界,我们知道 O(n×2n) 是一个比较松的上界,即在这份代码中,n 个位置每次考虑选或者不选,如果符合条件,就加入答案的时间代价。但是实际运行的时候,因为不可能所有的解都满足条件,递归的时候我们还会用 t a r g e t − c a n d i d a t e s [ i d x ] ≥ 0 target−candidates[idx]≥0 targetcandidates[idx]0进行剪枝,所以实际运行情况是远远小于这个上界的。

空间复杂度: O ( t a r g e t ) O(target) O(target)。除答案数组外,空间复杂度取决于递归的栈深度,在最差情况下需要递归 O ( t a r g e t ) O(target) O(target)层。

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        def dfs(begin, path, target):
            if target < 0:
                return
            if target == 0:
                res.append(path)
                return
            # target每减去一个数candidates[index],就向path中添加这个数candidates[index]
            for index in range(begin, size):
                dfs(index, path + [candidates[index]], target - candidates[index])

        size = len(candidates)
        res = []
        dfs(0, [], target)
        return res

40. 组合总和 II

给定一个候选人编号的集合 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]
]

搜索回溯

由第 39 题我们知道,数组 candidates 有序,也是 深度优先遍历 过程中实现「剪枝」的前提。
将数组先排序的思路来自于这个问题:去掉一个数组中重复的元素。很容易想到的方案是:先对数组 升序 排序,重复的元素一定不是排好序以后相同的连续数组区域的第 1 个元素。也就是说,剪枝发生在:同一层数值相同的结点第 2、3 … 个结点,因为数值相同的第 1 个结点已经搜索出了包含了这个数值的全部结果,同一层的其它结点,候选数的个数更少,搜索出的结果一定不会比第 1 个结点更多,并且是第 1 个结点的子集。

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        size = len(candidates)
        res = []
        def dfs(begin, path, target):
            if target < 0:
                return
            if target == 0:
                res.append(path)
                return
            # target每减去一个数candidates[index],就向path中添加这个数candidates[index]
            for index in range(begin, size):
                if index > begin and candidates[index - 1] == candidates[index]:
                    continue
                dfs(index + 1, path + [candidates[index]], target - candidates[index])
		candidates.sort()
        dfs(0, [], target)
        return res
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

39. 组合总和 40. 组合总和 II 的相关文章

随机推荐

  • BCD码-8421码、5421码、2421码、余3码

    一 BCD码的转换原理 BCD码 使用 4 位二进制来表示 1 位十进制 即使用 4 个位来存储一个十进制的值 使二进制和十进制之间的转换以快捷的进行 比如 使用4位二进制 0000 表示 十进制 0 使用4位二进制 0001 表示 十进制
  • 如何实现html上传文件并被Django后台处理

    如何实现html上传文件并被Django后台处理 1 html前端代码编写 先看代码 代码如下
  • CString类常用方法----Left(),Mid(),Right()……

    CStringLeft intnCount const 从左边1开始获取前 nCount个字符 CStringMid intnFirst const 从左边第 nCount 1个字符开始 获取后面所有的字符 CStringMid intnF
  • 二进制方式部署k8s集群1.21版本-域名形式

    二进制方式部署k8s 1 21版本 域名形式 说明 系统参数 主机名称 IP地址 部署节点 部署组件 m1 192 168 11 187 k8s1 masterk8s2 master k8s1 etcd apiserver controll
  • 爬虫(五):python中的POST的四种请求方式(编码格式)

    POST请求主要包含json格式 xml格式 文件上传 form data 及默认传递的urlencoded HTTP的报文结构 1 请求行 请求方法 请求URL HTTP协议版本三个部分 2 请求头 从第二行开始到倒数第二行都是我们的请求
  • Clang之语法抽象树AST

    语法分析器的任务是确定某个单词流是否能够与源语言的语法适配 即设定一个称之为上下文无关语言 context free language 的语言集合 语法分析器建立一颗与 词法分析出的 输入单词流对应的正确语法树 语法分析树的建立过程主要有两
  • Nacos与Eureka的异同

    1 架构设计 Eureka采用CS架构 由服务注册中心Eureka Server和服务提供者 消费者Eureka Client组成 Nacos采用高可用的P2P设计 无主节点 所有的server节点都是同等作用 支持AP和CP两种模式 2
  • Android 自动获取经纬度,计算距离、经纬度、方位角

    最近做一个项目需要通过GPS获取经纬度 通过计算算出两点之间的距离 通过对Google和百度的疯狂轰炸 终于找到了解决的办法 首先声明权限 android name android permission ACCESS FINE LOCATI
  • Scrcpy视频同步源码分析

    什么是Scrcpy https github com Genymobile scrcpy Scrcpy是genymobile开源的一款手机镜像软件 通过对手机音视频的采集和同步 可以实现在PC平台上控制手机的功能 官方解释 此应用程序镜像通
  • PHP Drupal个人博客

    PHP Drupal个人博客 官网 Prerequisite PHP Composer 快速安装 composer create project drupal recommended project drupal cd drupal php
  • lucene 总体架构

    本文转载至 http www cnblogs com forfuture1978 archive 2009 12 14 1623596 html Lucene概述 一个高效的 可扩展的 全文检索库 全部用Java实现 无须配置 仅支持纯文本
  • 混合整数规划(Mixed Integer Programming)

    混合整数规划 Mixed Integer Programming 混合整数规划问题是运筹优化中经常遇到的一类问题 在这类问题中自变量的类型可能是整数也可能不是整数 相比于连续优化 混合整数规划很多时候会更难求解 在学术界混合整数规划一直是一
  • 最小生成树(普里姆算法和克鲁斯卡尔算法)

    1 基本介绍 2 普里姆算法 普里姆算法 package algorithm import java util Arrays public class PrimDemo public static final int MAX VALUE 1
  • 从p文件到m文件,快速将Matlab p代码转换成m文件

    你是否遇到过这样的问题 发现自己写的Matlab代码根本无法加密 或者别人发给你的MATLAB代码无法打开或运行 如果是这样 那么你需要一款强有力的Matlab解密工具 左左Matlab解密助手 左左解密助手是一款功能强大的Matlab解密
  • 状态机模型

    参考 什么是状态机 用C语言实现进程5状态模型 参考 设计模式 一目了然的状态机图 案例 状态模式 C语言实现 MP3播放 暂停案例 STM32按键消抖 入门状态机思维 常用的while循环内switch case形式 实现状态机的状态跳转
  • java自动化测试语言基础之正则表达式

    java自动化测试语言基础之正则表达式 文章目录 java自动化测试语言基础之正则表达式 Java 正则表达式 Java 正则表达式 正则表达式定义了字符串的模式 正则表达式可以用来搜索 编辑或处理文本 正则表达式并不仅限于某一种语言 但是
  • 树莓派 OCR识别 2-2:chineseocr_lite 部署

    chineseocr lite github项目地址 https github com ouyanghuiyu chineseocr lite 超轻量级中文ocr 支持竖排文字识别 支持ncnn推理 dbnet 1 8M crnn 2 5M
  • JAVA 获取某段时间内的所有日期集合

    集合里包含月份 开始 结束 2019 01 01 00 00 00 2019 01 31 23 59 00 2019 02 01 00 00 00 2019 02 28 23 59 00 2019 03 01 00 00 00 2019 0
  • 社区生鲜团购小程序

    摘 要 随着生活质量的提高 人们对生鲜购物体验的要求逐步升级 传统生鲜物流成本相对较高 生鲜产品品质控制困难 在新零售背景下的社区生鲜团购模式拥有经营成本低 用户黏性高等优点 互联网与实体店相结合带来了更多的便利和机会 自微信推出以来 就迅
  • 39. 组合总和 40. 组合总和 II

    39 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target 找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 并以列表形式返回 你可以按 任意顺序 返回这些组合