题目:
和为S的连续正数序列
链接:
https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。
思路:
设置一个path变量,存放当前的数字序列,和一个csum代表当前序列的和,如果csum>sum 则去除小值,如果<sum, 增加大值,如果==sum则打印
代码:
1 class Solution { 2 public: 3 vector<vector<int>> FindContinuousSequence(int sum){ 4 if(sum <= 2){ 5 return res; 6 } 7 path = {1}; 8 int csum =1; 9 for(int i = 2;i<= (sum+1)/2;++i){ 10 path.push_back(i); 11 csum += i; 12 if(csum == sum ){ 13 res.push_back(path); 14 } 15 else{ 16 while(csum>sum){ 17 csum -= path[0]; 18 path.erase(path.begin()); 19 } 20 if(csum == sum){ 21 res.push_back(path); 22 } 23 } 24 } 25 return res; 26 } 27 private: 28 vector<vector<int>> res; 29 vector<int> path; 30 };