求陣列中和為某一值的全部組合
阿新 • • 發佈:2019-01-08
下面先貼出程式碼,然後再說幾點應該特別注意的。
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的內層迴圈當中,在減去最原先的數字之後,我們應該加一個判斷,為什麼呢?否則無法得到後面的幾個和為某一值的子序列。