1. 程式人生 > >求陣列中和為某一值的全部組合

求陣列中和為某一值的全部組合

下面先貼出程式碼,然後再說幾點應該特別注意的。

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的內層迴圈當中,在減去最原先的數字之後,我們應該加一個判斷,為什麼呢?否則無法得到後面的幾個和為某一值的子序列。