在数组找到和为给定值的多个数

这篇博客探讨了如何在数组中寻找和为给定值的多个数。针对两种情况进行了讨论:(1)对于寻找两个数的情况,建议先对数组排序,然后使用双指针的“夹逼”策略;(2)对于寻找多个数,提出了使用递归算法的解决方案。此外,文中还提供了其他解题思路,并引用了一篇相关文章作为参考。

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

(1)如果是两个数,则可以先排序再用“夹逼”

#include<iostream>
#include<algorithm>
#include<map>

using namespace std;

typedef pair<int,int>Index;
Index findSum(int arr[],int len,int sum)
{
	sort(arr,arr+len);
	int start = 0;
	int end = len -1;
	while(start<end){
		if(arr[start]+arr[end]<sum){
			++start;
		}
		else if(arr[start]+arr[end]>sum)
		{
			--end;
		}
		else{
			return make_pair(start,end);
		}
	}
}

int main()
{
	int arr[]={1,2,4,5,6};
	Index id;
	int sum = 11;
	id = findSum(arr,5,sum);
	cout<<arr[id.first]<<"+"<<arr[id.second]<<endl;
	return 0;
}

(2)如果是多个数,用递归算法

#include<vector>
#include<iostream>

using namespace std;

vector<int> ivec;

void findSum(int arr[],int n,int sum)
{
	//cout<<n<<endl;
	if(sum<=0||n<=0)return;
	if(arr[n] == sum){
		vector<int>::iterator it;
		for(it=ivec.begin();it!=ivec.end();++it)
			cout<<*it<<"+";
		cout<<arr[n]<<endl;
	}

	ivec.push_back(arr[n]);
	findSum(arr,n-1,sum-arr[n]);
	ivec.pop_back();
	findSum(arr,n-1,sum);
}

int main()
{
	int arr[]={1,2,4,5,6};
	findSum(arr,4,12);
	return 0;
}

另解1:

#include<vector>  
#include<iostream>  

using namespace std;  

vector<int> ivec;  

void findSum(int arr[],int n,int sum)  
{   
	if(0 == sum){  
		vector<int>::iterator it;  
		for(it=ivec.begin();it!=ivec.end();++it)  
			cout<<*it<<" ";  
		cout<<endl; 
		return;
	}  

	if(n==0)return;  //注意一定要在这里停止

	ivec.push_back(arr[n]);  
	findSum(arr,n-1,sum-arr[n]);  
	ivec.pop_back();  
	findSum(arr,n-1,sum);  
}  

int main()  
{  
	int arr[]={1,2,4,5,6,8,7};  
	findSum(arr,6,12);  
	system("pause");
	return 0;  
}

另解2:

#include<vector>
#include<iostream>

using namespace std;

vector<int> ivec;

void findSum(int arr[],int n,int remain_sum,int sum)
{
	if(remain_sum<0||sum<remain_sum)return;
	if(remain_sum == 0){
		vector<int>::iterator it;
		for(it=ivec.begin();it!=ivec.end();++it)
			cout<<*it<<" ";
		cout<<endl;
		return;
	}

	ivec.push_back(arr[n]);
	findSum(arr,n-1,remain_sum-arr[n],sum-arr[n]);
	ivec.pop_back();
	findSum(arr,n-1,remain_sum,sum-arr[n]);
}

int main()
{
	int arr[]={1,2,4,5,6,7,8};
	int sum = 0;
	for(int i=0;i<=6;i++){
		sum += arr[i];//求数组的总和
	}
	findSum(arr,6,12,sum);//求出数组中所有和为12的数。
	system("pause");
	return 0;
}

上面这种解法也是参照http://blog.youkuaiyun.com/u010064842/article/details/8830611
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值