寻找和为给定值的n个数

问题描述:输入一个数组A[0…N-1]和一个数字Sum,在数组中查找n个数使得他们的和为Sum。

1.n=2(找两个数)

1)直接暴力法
实现思路:直接遍历整个数组,让每一个数字和其他数组相加,如果和为Sum,输出;否则,接着遍历。
实现方法如下:

void FindAandB(int a[], int n,int sum) {
   
	int flag = 0;
	for (int i = 0; i < n-1; i++)
	{
   
		for (int j = i + 1; j < n; j++) {
   
			if (a[i]+a[j]==sum)
			{
   
				cout << a[i] << "  " << a[j] << endl;
				flag = 1;
				break;
			}
		}
		if (flag)
		{
   
			break;
		}
	}
}

2)上述算法的稍加改进
实现思路:先对整个数组进行排序,然后使用两个索引i,j分别指向数组的开头和结尾,如果a[i]+a[j]>Sum,则j–;如果a[i]+a[j]<Sum,则i++,如果相等,则输出,循环的退出条件是i>=j时突出循环或者找到满足条件的两个元素。
实现方法如下:

void findAandB1(vector<int> a, int n, int sum) {
   
	sort(a.begin(), a.end());//排序
	int i = 0; int j = n - 1;
	while (i<j)
	{
   
		if (a[i] + a[j] > sum)
			j--;
		else if (a[i]+a[j]<sum)
		{
   
			i++
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
,你有什么思路和方法吗? 对于这个问题,可以使用递归算法来解决。首先,定义一个函数来实现递归: def findSum(lst, s, n): # 如果n等于1,则直接返回s是否在lst中 if n == 1: return s in lst # 如果列表为空或者n大于列表长度,则返回False if not lst or n > len(lst): return False # 遍历列表 for i, val in enumerate(lst): # 跳过重复的数字 if i > 0 and lst[i] == lst[i-1]: continue # 递归查找是否有n-1个数字的和等于s减去当前 if findSum(lst[i+1:], s-val, n-1): return True return False 然后,调用该函数来查找列表中相加等于s的n个数字: def findNsum(lst, s, n): # 排序列表 lst.sort() # 如果列表中最小的n个数的和都大于s或者最大的n个数的和都小于s,则返回空列表 if sum(lst[:n]) > s or sum(lst[-n:]) < s: return [] # 查找n个数字的和为s for i in range(len(lst)-n+1): # 跳过重复的数字 if i > 0 and lst[i] == lst[i-1]: continue # 如果当前数字与后面n-1个数字的和大于s,则直接返回结果 if lst[i] + sum(lst[i+1:i+n]) > s: break # 如果当前数字与后面n-1个数字的和等于s,则添加到结果中 if lst[i] + sum(lst[-n:]) == s: return [lst[i]] + lst[-n:] # 查找是否有n-1个数字的和等于s减去当前数字 if findSum(lst[i+1:], s-lst[i], n-1): return [lst[i]] + findSum.lst return [] 该函数首先将列表进行排序,然后根据最小的n个数的和和最大的n个数的和来判断是否需要查找。如果需要查找,则遍历列表,如果当前数字与后面n-1个数字的和大于s,则直接返回结果;如果当前数字与后面n-1个数字的和等于s,则添加到结果中;否则查找是否有n-1个数字的和等于s减去当前数字。如果都没有找到,则返回空列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值