求数组中若干个元素之和等于给定值

本文介绍了一种在数组中查找多个元素之和等于给定目标值的方法,通过使用栈数据结构来实现这一过程。从数组的第一个元素开始,逐个检查数组中的元素,同时维护一个栈来存储当前元素的和。当元素之和小于目标值时,继续添加元素到栈中;当元素之和大于目标值时,从栈中移除元素并尝试调整和的大小。最终,当找到满足条件的元素组合时,输出这些元素作为答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题的基础版本是:在数组中找两个元素,使其之和等于某个给定值。解法简单:将数组排序后,用两个指针分别位于数组首与数组尾,然后计算两个指针所指元素的和,若大于给定的元素,则尾部的指针向前移动;若小于给定的元素,则首部的指针向后移动。

但该问题提升后,成为了子集和问题,这是一个NP问题。在leetcode上还有升级版本的问题:求给定数组中四个元素之和等于给定元素的所有元素的子集。该问题,只能用暴力搜索,加点启发式的暴力搜索,在数量到两个数之后用上述的两数之和的方法。

看了一个作者的博客里面的例子,理解了在数组中找若干个元素之和等于给定值的方法。作者博客见:点击打开链接

举一个简单的适合自己理解的例子:

数组为: [1,2,3,4,5,6]。找给定值 12 。元素个数不限定,只要找到的元素之和=12即可

初始化栈:

【1】 栈中元素和为 1 < 12。压入 1 的下一个元素 2

【1,2】 栈中元素和为 3 < 12 。压入 2 的下一个元素 3

【1,2,3】 栈中元素和为 6 < 12 。压入 3 的下一个元素 4

【1,2,3,4】 栈中元素和为 10 < 12 。压入 4 的下一个元素 5

【1,2,3,4,5】 栈中元素和为 15 > 12。则将栈顶元素 5 出栈,并将新的栈顶元素 4 扩大为位于其后的值

【1,2,3,5】 栈中元素和为 11 < 12。压入 5 的下一个元素 6

【1,2,3,5,6】 栈中元素和为 17 > 12。则将栈顶元素 6 出栈,并将新的栈顶元素 5 扩大为位于其后的值

【1,2,3,6】 栈中元素和为 12 = 12。则结束程序,栈中的元素即为找到的子集


实现代码如下:

vector<int> addSum(vector<int> & v,int dest_sum)
{
	typedef int Value;
	typedef int Loc;
	std::sort(v.begin(), v.end());
	stack<pair<Value,Loc>> sta;
	int loc = 0;
	int init_loc = 0;
	int sum = v[loc];
	sta.push({ v[loc],loc});
	++loc; 
	while (sum != dest_sum)
	{
		if (loc < v.size() && sum + v[loc] <= dest_sum)
		{
			sum += v[loc];
			sta.push({ v[loc], loc });
			++loc;
		}
		else
		{
			if (!sta.empty())
			{
				auto v = sta.top();
				sum -= v.first;
				sta.pop();
				loc = v.second + 1;
			}
			else
			{
				sum = 0;
				loc = ++init_loc;
			}
		}
	}
	
	vector<int> res;
	while (!sta.empty())
	{
		res.push_back(sta.top().first);
		sta.pop();
	}
	return res;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值