当前位置: 首页 > news >正文

从零学算法39

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
输出: []
提示:
1 <= candidates.length <= 30
2 <= candidates[i] <= 40
candidates 的所有元素 互不相同
1 <= target <= 40

  • 回溯:定义函数 dfs(list, sum) 表示目前组合为 list,此时数组中的和为 sum
  • 当 sum 等于 target,说明找到一种可能,把 list 加入结果数组 res
  • 当 sum 大于 target,再添加元素只会更大,终止之后的操作
  • 当 sum 小于 target,遍历 candidates,尝试添加其中的每一个元素看能够等于 target
  • 此时伪代码大致如下
    • public void dfs(List list, int sum){if(sum == target)加入结果并返回if(sum > target)别继续尝试了直接返回for(int n:candidates){list添加ndfs(list, sum + n)复原list,等待进行下一次新的尝试}
      }
      
  • 但是这会有一个问题,比如例1中,我们不仅能得到[2,2,3],还会得到诸如[2,3,2][3,2,2],说明我们重复尝试了一些可能
    • 比如当我们尝试完了从 2 开始的所有可能后即[2,…],下次从 3 开始时,不应该再去尝试从 2 开始的[3,2…],因为之前从 2 开始尝试的可能组合中也有[2,3…],他俩属于同一个子集
    • 所以修改函数,入参增加下标 start,表示之后的尝试应该从 start 开始,否则会重复尝试
  •   int[] candidates;int target;List<List<Integer>> res = new ArrayList();public List<List<Integer>> combinationSum(int[] candidates, int target) {this.candidates = candidates;this.target = target;List<Integer> list = new ArrayList();dfs(list, 0, 0);return res;}public void dfs(List list, int sum,int start){if(sum > target)return;if(sum == target){res.add(new ArrayList(list));return;}for(int i=start;i<candidates.length;i++){list.add(candidates[i]);dfs(list,sum+candidates[i],i);list.remove(list.size()-1);}return;}
    
  • 优化:之前 sum > target 时虽然 return 了,但是回溯后,比如之前加了个 3 发现数组和大于 target,现在回溯回来,哪怕 candidates 中还有 4,5,..,也会尝试添加到当前组合。
  • 所以我们对 candidates 进行排序,只要当前组合加上新元素后大于 target,那之后的也不用尝试了,直接退出循环
  •   int[] candidates;int target;List<List<Integer>> res = new ArrayList();public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sort(candidates);this.candidates = candidates;this.target = target;List<Integer> list = new ArrayList();dfs(list, 0, 0);return res;}public void dfs(List list, int sum,int start){if(sum == target){res.add(new ArrayList(list));return;}for(int i=start;i<candidates.length;i++){if(sum + candidates[i] > target)break;list.add(candidates[i]);dfs(list,sum+candidates[i],i);list.remove(list.size()-1);}return;}
    
http://www.dtcms.com/a/410046.html

相关文章:

  • BIKE算法:后量子密码标准化竞赛中的编解码候选者
  • 【字节跳动】LLM大模型算法面试题:什么是 LangChain?LangChain 包含哪些 核心概念?
  • 降低fullgc停顿时间
  • BatchNorm2d详细原理介绍
  • Spring Boot WebSocket:使用 Java 构建多频道聊天系统
  • 中堂镇仿做网站软文网站有哪些
  • Android 应用配置跳转微信小程序
  • Word和WPS文字中的自动编号和文字间距过大怎么办?
  • 京东零售张泽华:从营销意图到购买转化,AI重塑广告增长
  • Casey‘s EDI 需求分析
  • 网站美工和平面设计师手机网站域名开头
  • 从垂直钻到水平钻:如何用陀螺精准掌控钻井轨迹?
  • yield在Python中的应用
  • Linux配置Java/JDK(解决Kali启动ysoserial.jar JRMPListener报错)暨 Kali安装JAVA8和切换JDK版本的详细过程
  • springboot用jar启动能访问,但是打成war,部署到tomcat却访问不到
  • 免费企业网站建设流程华为公司电子商务网站建设策划书
  • 中国网站备案查询系统东莞seo外包公司哪家好
  • STM32H743-ARM例程6-RS422
  • 倾角传感器厂家为物联网应用提供高效双轴监测解决方案
  • 住宅IP vs 数据中心IP 2025实战性能对决:IPIPGO、天启HTTP、光络云深度横评
  • 成都网站seo公司wordpress页面视频播放
  • EasyClick JavaScript正则表达式匹配规则
  • 盟接之桥说制造:“首件手板”商业模式:制造业的下一个黄金赛道,你的公司准备好了吗?
  • mysql怎么安装,新手安装MySQL后如何安全备份不踩坑?
  • 【Git】分⽀管理
  • 半导体制造常见分析仪器之高分辨率 3D X 射线显微镜
  • PCB 半固化片:多层板制造的技术基石,猎板的场景化适配与质控逻辑
  • 番禺网站设计与制作广州海佳网络网站建设公司怎么样
  • Spring Cloud 负载均衡(LoadBalancer)与服务调用(OpenFeign)详解
  • 基于HTTP构建局域网内YUM网络源:详细操作指南(太细)