思路比较简单,数列上有两个指针,如果指针内的数的和比 sum 小,那么就右移右边指针让和变大,否则就右移左边指针让和变小。这样,就能按照一个方向一直找到所有可能的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int>> result; if(sum<3) return result; int small=1,big=2,add=3; while(small<=sum/2){ if(add<sum) add+=++big; else if(add>sum) add-=small++; else{ this->addSequence(small,big,&result); add+=++big; } } return result; } void addSequence(int small,int big,vector<vector<int>>* result){ vector<int> seq; for(int i=small;i<=big;i++){ seq.push_back(i); } result->push_back(seq); } };
|