和為S的兩個數字 VS 和為S的連續正數序列
阿新 • • 發佈:2019-01-07
來自劍指offer
#include "stdafx.h" #include <iostream> using namespace std; bool FindNumbersWithSum(int* data, int length, int sum, int* num1, int* num2) { bool bFound = false; if(data==NULL || length < 1) return bFound; int ahead = length-1; int behind = 0; while ( ahead > behind ) { int curSum = data[ahead] + data[behind]; if (curSum == sum) { *num1 = data[behind]; *num2 = data[ahead]; bFound = true; break; } else if (curSum > sum) ahead--; else behind++; } return bFound; } int _tmain(int argc, _TCHAR* argv[]) { int a[] = {1,2,4,7,11,15}; int num1, num2; if ( FindNumbersWithSum(a,6,15,&num1,&num2) ) { cout <<"num1 = "<<num1<<" num2 = "<<num2<<endl; } else cout <<"not found!"<<endl; return 0; }
分析:與上述思路基本類似,把small,big分別初始化為1,2。例如,我們求和為9的全序列,那麼small和big的變化如下圖所示。
程式碼:
#include "stdafx.h" #include <iostream> using namespace std; void PrintContinuousSequence(int small, int big) { cout <<"Continusou Sequence is: "; for (; small <= big; small++) cout << small <<" "; cout << endl; } void FindContinuousSequence(int sum) { if (sum < 3) return; int small = 1; int big = 2; int middle = (1+sum)>>1; int curSum = small + big; while ( small < middle ) { if ( curSum == sum ) { PrintContinuousSequence(small,big); big++; curSum +=big; } else if ( curSum > sum ) { curSum -= small; small++; } else { big++; curSum += big; } } } int _tmain(int argc, _TCHAR* argv[]) { FindContinuousSequence(15); return 0; }