面试题57 - II. 和为s的连续正数序列
题目:
输入一个正整数 target
,输出所有和为 target
的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
解答:
方法1:
暴力就完事了嗷
class Solution { public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int>> res; vector<int> cur; for(int i=target/2+1;long(i)*(i+1)>=2*target;--i){ int p=target,j=i; while(p>0 and p>=j){ p-=j; --j; } if(p==0){ for(int k=j+1;k<=i;++k){ cur.emplace_back(k); } res.emplace_back(move(cur)); } } reverse(res.begin(),res.end()); return res; } };
方法2:
滑动窗口,因为是连续的数字和,挺明显要用滑窗的。。应该做题时能注意到这个信息点的阿。o(︶︿︶)o 唉
class Solution { public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int>> res; int le=1,ri=1,cur_sum=0; while(ri<target/2+3){ while(cur_sum<target){ cur_sum+=ri++; } if(cur_sum==target){ res.push_back({}); for(int i=le;i<ri;++i){ res.back().emplace_back(i); } cur_sum+=ri++; } else{//> while(cur_sum>target){ cur_sum-=le++; } } } return res; } };
进击的小🐴农