代码随想录算法训练营第二十六天(回溯算法篇)|39. 组合总和,40. 组合总和Ⅱ

news/2025/1/11 4:15:30/

39. 组合总和

题目链接:39. 组合总和 - 力扣(LeetCode)

题目内容:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

思路:和之前的组合那道题不同点在于1. if条件不用要求path的长度,只要和相同,就返回,可以加上剪枝——当和大于target,直接返回。2. 递归时的起始值(startIdx)是i,不是i+1, 因为可以重复。

class Solution(object):def traversal(self, result, path, sum, startIdx, candidates, target):if sum > target:returnif sum == target:result.append(path[:])returnfor i in range(startIdx, len(candidates)):path.append(candidates[i])sum += candidates[i]self.traversal(result, path, sum, i, candidates, target)path.pop()sum -= candidates[i]return resultdef combinationSum(self, candidates, target):result = []path = []return self.traversal(result, path, 0, 0, candidates, target)

40. 组合总和Ⅱ

题目链接:40. 组合总和 II - 力扣(LeetCode)

题目难点:题目里给出的数组有重复元素,但要求答案里不能有重复组合.

思路:我们要对同一数层上重复使用的元素去重——前一个相同的元素要相加的数的范围大于后面那个元素家的范围,所以一定包含后一个元素找到的数。因此,我们可以对candidates进行排序,做for循环时只需判断当前元素和它前一个元素是否相同,若相同,就pass掉,对当前元素不做处理,继续跳到后一个数。

class Solution(object):def traversal(self, result, path, sum, startIdx, candidates, target):candidates = sorted(candidates)if sum > target:returnif sum == target:result.append(path[:])returnfor i in range(startIdx, len(candidates)):if candidates[i] == candidates[i-1]:passpath.append(candidates[i])sum += candidates[i]self.traversal(result, path, sum, i, candidates, target)path.pop()sum -= candidates[i]return resultdef combinationSum(self, candidates, target):result = []path = []return self.traversal(result, path, 0, 0, candidates, target)


http://www.ppmy.cn/news/1270913.html

相关文章

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 数据库 文章目录 前言合并区间问题📕现实应用大致思路代码实现代码讲解 最长不连续子序列&a…

vue2.0使用vue-pdf(简单版本)

1.引入vue-pdf(vue-pdf版本:4.3.0,vue版本:2.6.14) npm install --save vue-pdf2.引入本地文件(放public文件夹下用于测试。后期用接口返回的地址) 111.pdf:自己随意生成的一个 3…

美容店预约小程序搭建指南

随着互联网的发展,越来越多的传统行业开始尝试将业务与互联网相结合,以提供更加便捷、高效的服务。美容行业也不例外。本文将通过使用第三方制作平台,如乔拓云网,指导您如何搭建一个美观实用的美容店预约小程序,帮助您…

用提问的方式来学习:冯·诺伊曼体系结构与操作系统OS

学习冯诺伊曼体系结构之前,我们要本着两个问题来学习: 什么是冯诺伊曼体系结构?为什么要有冯诺伊曼体系结构? 一、冯诺伊曼体系结构 1. 什么是冯诺伊曼体系结构? 那我们就先来回答一下什么是冯诺伊曼体系结构&#x…

(SpringBoot)第十一章:SpringBoot 统一功能处理(AOP实战)

文章目录 一:用户登录权限验证(1)传统用户登录验证(2)使用原生Spring AOP进行用户登录验证(3)Spring 拦截器A:自定义拦截器B:拦截器实现原理①:概述②:源码分析(4)补充:统一访问前缀的添加二:统一异常处理三:统一数据返回格式Spring AOP使Spring Boot统一功能处…

Vue3el-upload 实现在组建之外提供一个上传按钮

有这么一个需求,在使用el-upload组件进行文件上传的时候,除了组件默认提供的上传按钮,还要在列表的最前面自定义的加一个上传按钮,点击这个自定义的上传按钮要实现和点击默认的上传按钮同样的全套的上传流程 默认的: …

STP笔记总结

STP --- 生成树协议 STP(Spanning Tree Protocol,生成树协议)是根据 IEEE802.1D标准建立的,用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路,并有选择地对某些端口进行阻…

转载:TableView性能优化

转载:TableView性能优化 原文链接:https://juejin.cn/post/6955731915672387592 tableView性能优化 Cell重用、标识重用 使用 static 修饰重用标识名称能够保证这个标识只会创建一次,提高性能。接着调用dequeueReusableCellWithIdentifie…