[LeetCode刷题记录]39 组合总和
题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
难度
中等
题解
从给定范围内寻求所有可行解,可以使用搜索回溯来解决。
题中已说明candidates中的元素可以无限制重复使用,那么最直观的方法就是直接for循环遍历一遍,看能不能找到两个元素构成target,不行的话再来一遍,看能不能找的三个元素构成target,直到执行了candidates.size()个for循环。这时候,递归可以解决这样的多层for循环。
伪代码如下:
dfs ()
{
if target == 0
{
保存结果;
返回;
}
for(auto num : candidates)
{
元素存入缓存
dfs()
弹出缓存中最后一个元素,继续
}
}
实现
cpp
class Solution
{
public:
vector<vector<int>> combinationSum(vector<int> &candidates, int target)
{
vector<vector<int>> ans;
vector<int> res;
dfs(ans, res, candidates, target, 0);
return ans;
}
void dfs(vector<vector<int>> &ans, vector<int> &res, vector<int> &candidates, int target, int index)
{
if (target == 0)
{
ans.push_back(res);
return;
}
if (target < 0)
return;
//
for (int i = index; i < candidates.size(); ++i)
{
res.push_back(candidates[i]);
dfs(ans, res, candidates, target - candidates[i], i); // 不使用i+1,是为了可以重复使用当前的值
res.pop_back();
}
}
};
golang
改编自cpp实现:
var ans [][]int
var res [] int
func combinationSum(candidates []int, target int) [][]int {
ans = make([][]int,0)
res = make([]int,0)
dfs(candidates,target,0)
return ans
}
func dfs(candidates []int,target,index int){
if target == 0{
tmp := make([]int,len(res))
copy(tmp,res)
ans = append(ans,tmp)
return
}
if target < 0{
return
}
for i := index;i<len(candidates);i++{
res = append(res,candidates[i])
dfs(candidates,target-candidates[i],i)
res = res[:len(res)-1]
}
}
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
[LeetCode刷题记录]39 组合总和的更多相关文章
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
- leetcode 刷题记录(java)-持续更新
最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...
- LeetCode刷题记录(python3)
由于之前对算法题接触不多,因此暂时只做easy和medium难度的题. 看完了<算法(第四版)>后重新开始刷LeetCode了,这次决定按topic来刷题,有一个大致的方向.有些题不止包含 ...
- LeetCode 刷题记录(二)
写在前面:因为要准备面试,开始了在[LeetCode]上刷题的历程.LeetCode上一共有大约150道题目,本文记录我在<http://oj.leetcode.com>上AC的所有题目, ...
- LeetCode 刷题记录
写在前面:因为要准备面试,开始了在[LeetCode]上刷题的历程.LeetCode上一共有大约150道题目,本文记录我在<http://oj.leetcode.com>上AC的所有题目, ...
- Leetcode题库——39.组合总和
@author: ZZQ @software: PyCharm @file: combinationSum.py @time: 2018/11/14 18:23 要求:给定一个无重复元素的数组 can ...
- leetcode刷题记录——树
递归 104.二叉树的最大深度 /** * Definition for a binary tree node. * public class TreeNode { * int val; * Tree ...
- leetCode刷题记录
(1)Linked List Cycle Total Accepted: 13297 Total Submissions: 38411 Given a linked list, determine i ...
- 算法进阶之Leetcode刷题记录
目录 引言 题目 1.两数之和 题目 解题笔记 7.反转整数 题目 解题笔记 9.回文数 题目 解题笔记 13.罗马数字转整数 题目 解题笔记 14.最长公共前缀 题目 解题笔记 20.有效的括号 题 ...
随机推荐
- 火山引擎DataLeap的Catalog系统搜索实践(三):Learning to rank与后续工作
Learning to rank Learning to rank主要分为数据收集,离线训练和在线预测三个部分.搜索系统是一个Data-driven system,因此火山引擎DataLeap的Cat ...
- 火山引擎 DataLeap:在数据研发中,如何提升效率?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在数仓及中台研发过程中,研发人员经常需要在不同任务中维护相同或类似代码,不仅费时费力,并且代码迭代后也面临不同业务 ...
- SpringBoot 记录 access.log 日志
如何将不同业务模块产生的日志 分多文件记录 Tomcat 中有个日志 loca_access.log 可以记录每个接口的请求耗时,用于做性能等分析比较有用,SpringBoot里,默认不记录这个日志, ...
- 【辅助工具】Maven使用
Maven使用 错误排查 查看对应依赖在仓库中的路径,jar文件有没有下载成功,如果不成功直接把外部文件夹删除重新加载 导包错误 找到对应的路径,丛正常导入的同事直接复制过来. Maven启动项目 导 ...
- SpringMVC — 数据响应 / 获取请求参数
SpringMVC的数据响应方式 页面跳转 直接返回字符串 通过ModelAndView对象返回 回写数据 直接返回字符串 返回对象或集合 页面跳转 方式一.返回带有前缀的字符串: 转发:forwar ...
- 题解 [HDU6747] Rotate 期望 + 逆元
来源:2020 年百度之星·程序设计大赛 - 初赛一 一个圈,从内到外一共被分成了 \(n\) 个环,中间是空的. 我们把从外到内第 \(i\) 层环平分成 \(a[i]\) 份,其中 \(a[i]\ ...
- Codeforces Round #733 (Div. 1 + Div. 2)
比赛链接:Here 1530A. Binary Decimal 现在规定一种只由0和1组成的数字,我们称这种数字为二进制数字,例如10,1010111,给定一个数n,求该数字最少由多少个二进制数字组成 ...
- 基于 eBPF 的 Serverless 多语言应用监控能力建设
作者:竞霄 监控能力作为基础运维能力和核心稳定性措施,开发运维人员可以通过监控系统有效进行故障定位,预防潜在风险,分析长期趋势进行容量规划和性能调优,是软件开发生命周期中必不可少的一环.与此同时,Se ...
- 多倍图切图cutterman
- java进阶(5)--package与import
一.package 1.package的作用:为了方便程序的管理 2.package怎么使用:package+包名,只能出现在java代码的第一行 3.package命令规范:一般采用公司域名倒序方式 ...