首页 > 编程语言 >(算法)组合总和————<递归>

(算法)组合总和————<递归>

时间:2024-08-02 22:25:59浏览次数:15  
标签:递归 nums int sum 元素 aim 算法 vector 总和

1. 题⽬链接:39.组合总和 

2. 题⽬描述:

3. 解法:

算法思路:

candidates的所有元素互不相同,因此我们在递归状态时只需要对每个元素进⾏如下判断:

1. 跳过,对下⼀个元素进⾏判断;

2. 将其添加⾄当前状态中,我们在选择添加当前元素时,之后仍可以继续选择当前元素(可以重复选 择同⼀元素)。

• 因此,我们在选择当前元素并向下传递下标时,应该直接传递当前元素下标。

递归函数设计:void dfs(vector& candidates, int target, vector>& ans, vector& combine, int idx)  

参数:target(当前状态和与⽬标值的差),idx(当前需要处理的元素下标);

返回值:⽆;

函数作⽤:向下传递两个状态(跳过或者选择当前元素),找出所有组合使得元素和为⽬标值。

递归函数流程如下:

1. 结束条件:

        a. 当前需要处理的元素下标越界;

        b. 当前状态的元素和已经与⽬标值相同;

2. 跳过当前元素,当前状态不变,对下⼀个元素进⾏处理;

3. 选择将当前元素添加⾄当前状态,并保留状态继续对当前元素进⾏处理,递归结束时撤销添加操作。 

C++算法代码: 

class Solution
{
	int aim;
	vector<int> path;
	vector<vector<int>> ret;
public:
	vector<vector<int>> combinationSum(vector<int>& nums, int target)
	{
		aim = target;
		dfs(nums, 0, 0);
		return ret;
	}
	void dfs(vector<int>& nums, int pos, int sum)
	{
		if (sum == aim)
		{
			ret.push_back(path);
			return;
		}
		if (sum > aim || pos == nums.size()) return;
		// 枚举个数 
		for (int k = 0; k * nums[pos] + sum <= aim; k++)
		{
			if (k) path.push_back(nums[pos]);
			dfs(nums, pos + 1, sum + k * nums[pos]);
		}
		// 恢复现场 
		for (int k = 1; k * nums[pos] + sum <= aim; k++)
		{
			path.pop_back();
		}
	}
};

Java算法代码:

class Solution
{
	int aim;
	List<Integer> path;
	List<List<Integer>> ret;
	public List<List<Integer>> combinationSum(int[] nums, int target)
	{
		path = new ArrayList<>();
		ret = new ArrayList<>();
		aim = target;
		dfs(nums, 0, 0);
		return ret;
	}
	public void dfs(int[] nums, int pos, int sum)
	{
		if (sum == aim)
		{
			ret.add(new ArrayList<>(path));
			return;
		}
		if (sum > aim || pos == nums.length) return;
		// 枚举 nums[pos] 使⽤多少个 
		for (int k = 0; k * nums[pos] + sum <= aim; k++)
		{
			if (k != 0) path.add(nums[pos]);
			dfs(nums, pos + 1, sum + k * nums[pos]);
		}

		// 恢复现场 
		for (int k = 1; k * nums[pos] + sum <= aim; k++)
		{
			path.remove(path.size() - 1);
		}
	}
}

标签:递归,nums,int,sum,元素,aim,算法,vector,总和
From: https://blog.csdn.net/2301_79580018/article/details/140881494

相关文章

  • 算法·理论:KMP 笔记
    \(\text{KMP}\)笔记!上次比赛,出题人出了一个\(\text{KMP}\)模板,我敲了个\(\text{SAM}\)跑了,但是学长给的好题中又有很多\(\text{KMP}\),于是滚回来恶补字符串基本算法。\(\text{KMP}\)是上个寒假学的,为什么最近才完全理解,但\(\text{KMP}\)短小精悍,极其精简,确实难懂,所以很......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(5)
    Preface唉感觉最近把把红温负作用啊,这场就中期写05被卡常了就红温了一整场,放着更简单的题不写就疯狂乱搞结果不出所料地被打爆了,只能说是好似,赛后发现甚至有个题是去年一轮的原,结果比赛的时候没一个人看题意,属实绷不住了感觉现在每场的策略和心态都有很大问题啊,不把这些问题......
  • 【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+
    一、项目介绍眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障','糖尿病性视网膜病变','青光眼','正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网......
  • 二分算法思路及解题代码
    二分算法一、第一种二分(easy)例题一:力扣704.二分查找-力扣(LeetCode)方法:1.暴力循环遍历,时间复杂度为O(n),代码太简单就省略了也不建议用这种方法2.二分算法(重点)时间复杂度O(logn)解法思路:如果利用暴力那么这道题有一个很重要的条件没有用,那就是有序,如果选取......
  • 【数据结构算法经典题目刨析(c语言)】判断链表是否有环(图文详解)
    ......
  • 算法【位图】
    特别提醒:Python同学实现位运算的题目需要特别注意,需要自己去手动处理溢出和符号扩展等问题。比如:(n<<shift_amount)&0xFFFFFFFF一、位图原理其实就是用bit组成的数组来存放值,用bit状态1、0代表存在、不存在,取值和存值操作都用位运算。限制是必须为连续范围且不能过大。......
  • 文心一言 VS 讯飞星火 VS chatgpt (316)-- 算法导论22.3 8题
    八、请给出如下猜想的一个反例:如果有向图G包含一条从结点u到结点v的路径,并且在对图G进行深度优先搜索时有u.d<v.d,则结点v是结点u在深度优先森林中的一个后代。如果要写代码,请用go语言。文心一言:为了提供一个反例,我们需要考虑深度优先搜索(DFS)的特性,并构造一个图,其中存在从......
  • 精准防控,高效管理:AI智能分析网关V4区域未停留检测算法的介绍及应用
    一、区域未停留AI检测算法概述随着人工智能和计算机视觉技术的飞速发展,区域未停留AI检测算法作为一种重要的视频分析技术,逐渐在各个领域得到广泛应用。该算法通过高效处理视频流数据,能够实时分析并判断目标对象是否在预设区域内有足够的停留时间,为安全管理和事件预防提供了有力支......
  • SQL进阶技巧:Hive如何巧解和差计算的递归问题?【应用案例2】
    目录0问题描述1数据准备2问题分析3小结 0问题描述有如下数据:反应了每月的页面浏览量现需要按照如下规则计算每月的累计阅读量,具体计算规则如下:最终结果如下:1数据准备withdataas(select'2024-01'asmonth,2aspvunionallselect'2024-02'asm......
  • Tarjan算法和连通性相关(二)
    上一篇博客我们介绍了强连通分量,本文我们继续学习与连通性有关的一些概念割点什么是割点?对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点我们画个图理解一下:在这个图中,如果我们把3这个点给删除掉,那么这张图就会被拆分成两个部......