IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode70 -> 正文阅读

[数据结构与算法]leetcode70

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]
]
 

提示:

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

分析

  • 这道题目是之前组合问题的提升版本。主要难点是不能让有重复元素的集合的解集重复。
  • 如果直接使用set去重势必会耗费大量的时间,所以这里必须在遍历的时候去重,关键点就是在什么地方去重呢?我们允许递归的时候有着相同元素的存在,但却不允许相同元素在同一层出现。所以这里我们应该在for循环里面使用以i>start作为判定条件之一,保证至少同一层有两个元素,且上一个元素不能等于下一个元素,如果等于了,直接跳过(continue)。
  • 剪枝操作:和大于target即return

代码

res = []
path = []
nums.sort()

def backtrack(start):
    res.append(path[:])
    if len(path) >= len(nums):
        return

    for i in range(start,len(nums)):
        if i > start and nums[i] == nums[i-1]:
            continue
        path.append(nums[i])
        backtrack(i+1)
        path.pop()

backtrack(0)
return res

通过截图

在这里插入图片描述

小总结

有关组合的题目
包括本篇LeetCode70,
LeetCode77,216

LeetCode17,39

  • 有关组合的题目大概到这里就结束了,我们会发现在这类问题中,回溯算法是非常好用的。现在总结一下关于此类问题的一些经验:
  • 在单集合问题中,可以用一个start来表示搜索位置,具体搜索的范围一般不剪枝的话,就是(start,len(单集合))
  • 多集合的问题中,要取出每一个集合,然后遍历每一个集合。
  • 剪枝时视情况而定,比如求和的剪枝可以先排序,超过目标值再剪枝,超过集合长度剪枝等等。
for i in range(start,...)
  • 递归时,如果允许重复就:递归到i 不允许重复就到下一个元素,递归到i+1
  • 不要递归到start和start+1,两者是不一样的(我也不知道该怎么解释)
  • 做此类问题可以画一棵树图帮助理解和写代码。 横向遍历是for循环,纵向遍历是递归。

如有错误,敬请指正,欢迎交流,谢谢?(・ω・)ノ

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:17:09  更:2022-02-04 11:19:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:46:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码