【剑指offer】和为S的连续正数序列
题目链接:和为S的连续正数序列
题意:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
题解:模拟。用两个指针,一个指最低位,一个指向最高位。我们在这个范围求和。
如果当前sum小于S,增加高位,扩大范围;大于S,增加低位,缩小范围。
这样就能得到我们所要求的序列。
代码:
1 class Solution { 2 public: 3 vector<vector<int> > FindContinuousSequence(int sum) { 4 vector<vector<int>> result; 5 int high = 2; int low = 1; 6 while(low < high){ 7 int curSum = (low+high)*(high - low + 1)/2; 8 if(curSum < sum) high++; 9 if(curSum > sum) low++; 10 if(curSum == sum){ 11 vector<int> t; 12 for(int i = low ;i <= high; i++){ 13 t.push_back(i); 14 } 15 result.push_back(t); 16 low++; 17 } 18 } 19 return result; 20 } 21 };