和为S的连续正数序列★★
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
解题思路:
思路一:
自己想了一个复杂度为sum*log(sum)的想法,通过了所有case,但是感觉如果sum很大的话,可能会超时。其实就是对二分算法的改造,搜索左右区间的条件变成了判断
mid*(mid+1)/2-i*(i+1)/2 < sum ,也就是判断i到mid的和与sum的关系。
思路二:
看谈论区有滑动窗口的思路,之后研究
class Solution { public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int> > res; if(sum < 2) return res; for(int i= 0; i < sum; i++){ int l = i; int r = sum-1; int mid = (l+r)/2; while(l <= r){ mid = (l+r)/2; //cout<<"i="<<i <<" l="<<l<<" r="<<r <<" mid="<<mid <<" Cn="<<mid*(mid+1)/2 - i*(i+1)/2 <<endl; if(mid*(mid+1)/2 - i*(i+1)/2 < sum){ l = mid+1; }else if(mid*(mid+1)/2 - i*(i+1)/2 > sum){ r = mid-1; }else{ break; } } vector<int> vct; if(mid*(mid+1)/2 - i*(i+1)/2 == sum){ //cout<<"i"<<i<<" mid"<<mid<<endl; for(int j = i+1; j <= mid; j++){ if(j <= 0) continue; vct.push_back(j); } if(vct.size() >= 2) res.push_back(vct); } } return res; } };
学学学 练练练 刷刷刷