链接:
剑指 Offer 57 - II. 和为s的连续正数序列
题意:
找出所有和为t的连续正整数序列(至少含有两个数)
解:
简单题,根据等差数列和公式 (start+end)*len/2 差为1时 end=start+len-1
即用start和len就可以算出结果,易知start增大时,len减小
所以双指针,最多跑2*target,稍微优化一下
实际代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
vector<vector<int>> findContinuousSequence(int target)
{
//解法1: 等差数列和 (start+end)*len/2 差为1 end=start+len-1
vector<vector<int>>ans;
int start=1,len=target/2+1;
vector<int>temp;
for(;;)
{
//cout<<start<<"-"<<len<<endl;
ll end=start+len-1;//要开longlong不然溢出
double sum=(start+end)*len/2;
if(sum>target)
{
//cout<<">"<<endl;
len--;
}
if(sum==target)
{
temp.clear();
for(int i=start;i<start+len;i++) temp.push_back(i);
ans.push_back(temp);
start++;
}
if(sum<target)
{
//cout<<"<"<<endl;
len++;start++;
if(start>target/2) break;
}
}
return ans;
}
int main()
{
int t;cin>>t;
vector<vector<int>>ans=findContinuousSequence(t);
for(auto i:ans)
{
for(auto j:i)
{
cout<<j<<" ";
}
cout<<endl;
}
return 0;
}
限制:
1 <= target <= 10^5