求数组中和为某一值的全部组合

下面先贴出代码,然后再说几点应该特别注意的。

void Print(int* numbers, int start, int end)
{
	for(int i = start; i<= end; ++i)
	{
		cout<<numbers[i];
	}
	cout<<endl;
}


void FindNumbers(int* numbers, int length,int k)
{
	if(numbers == NULL || length <= 0)
	{
		return ;
	}
	
	int start, end;
	start = end = 0;
	int CurSum = numbers[end];

	while(end < length)
	{
		if(CurSum == k)
		{
			Print(numbers, start, end);
		}

		while(CurSum > k && start < length)
		{
			CurSum -= numbers[start];
			++start;

			if(CurSum == k)
			{
				Print(numbers, start, end);
			}
		}
		
		++end;
		CurSum += numbers[end];	
		
	}
}




int _tmain(int argc, _TCHAR* argv[])
{
	int numbers[] = {1,2,3,4,5,6,7,8};
	int len = sizeof(numbers)/sizeof(int);
	FindNumbers(numbers, len, 15);

	getchar();
	return 0;
}

第一点:我们在while循环中,最后的两句话,++end;CurSum += numbers[end];这两句话不可以放在判断语句中,为什么呢?如果我们现在拿到了第一个和为15的全部子序列,那么在打印完后,它会进入到一个死循环;所以我们应该直接放到最后面,不加判断;

第二点:CurSum要初始化为数组中的第一个数字,为什么呢?进入到while循环中,++end,得到的就是第二个数字了,所以需要先初始化为第一个数字;

第三点:在while的内层循环当中,在减去最原先的数字之后,我们应该加一个判断,为什么呢?否则无法得到后面的几个和为某一值的子序列。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值