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

组合总和

组合总和

​ 给你一个 无重复元素 的整数数组 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

题解

​ 从一个数组之中,拿取部分数来组成一个目标和,回溯每一次的操作,对于每一个数,都有拿取和不拿取两种状态,所以会有两个递归的分支,值得注意的是,因为数字是可以重复拿取的,所以拿完之后的递归的索引应该还停留在当前位置,但不拿的则直接 +1 (如果不能重复拿取,则两者都是 index + 1)

func combinationSum(candidates []int, target int) [][]int {var ans [][]intdfs(0, target, candidates, []int{}, &ans)return ans
}func dfs(index,target int, candidates,res []int, ans *[][]int) {if target == 0 {temp := make([]int, len(res))copy(temp, res)*ans = append(*ans, temp)return}if index == len(candidates) || target < 0 {return}// --- 对于每一个数,都可以选择与不选择// --- 这里递归,因为是可以重复选取的,所以index停留在当前位置,如果不可以重复选取,则 index + 1res = append(res, candidates[index])dfs(index, target - candidates[index], candidates, res, ans)res = res[:len(res) - 1]dfs(index + 1, target, candidates, res, ans)
}
class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> ans = new ArrayList<List<Integer>>();dfs(0, target, candidates, new ArrayList<Integer>(), ans);return ans;}private void dfs(int index, int target, int[] candidates, List<Integer> list, List<List<Integer>> ans){if(index == candidates.length) {return;}if(target == 0){List<Integer> temp = new ArrayList<Integer>(list);ans.add(temp);return;}if(target - candidates[index] >= 0){list.add(candidates[index]);dfs(index, target - candidates[index], candidates, list, ans);list.remove(list.size() - 1);}dfs(index + 1, target, candidates, list, ans);}
}

http://www.mrgr.cn/news/61502.html

相关文章:

  • 后端技术选型 sa-token校验学习 下 结合项目学习 后端鉴权
  • 我这不需要保留本地修改, 只需要拉取远程更改
  • 罗永浩再创业,这次盯上了 AI?
  • TypeScript 爬虫项目实战:抓取豆瓣电影 Top 250(TypeScript简单应用)
  • 【C++】find() 函数全解
  • git问题
  • 深度学习:梯度下降算法简介
  • 算法练习:LCR 179. 查找总价格为目标值的两个商品
  • “格格不入”的星瑞东方曜,燃油市场有麻烦了
  • 【Rust笔记】Rocket实现自定义的Responder
  • 【数据结构与算法】力扣 23. 合并 K 个升序链表
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-8
  • 【python实操】python小程序之测试报告
  • RESCAL张量分解检测YELP数据集
  • JVM垃圾回收算法
  • C++引用类型变量
  • 深入了解 JavaScript 字符串方法:从字符获取到大小写转换
  • 如何使用非官方的根组件
  • c++习题36-奇数单增序列
  • 双指针——对撞指针与左右指针
  • Spring Boot集成Milvus和deeplearning4j实现图搜图功能
  • 提升质量:构建系统性的质量保证策略
  • java-web-day6-下-知识点小结
  • 构建生产级的 RAG 系统
  • GCC及GDB的使用
  • 自适应阻抗案例分析(上)