剑指OFFER 和为S的连续整数序列
剑指OFFER 和为S的连续整数序列
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
Good Luck!
思路
与 剑指OFFER 连续数组的最大和解法相似
都是通过穷举把所有的和求出来,但是运用到了一些动态规划的思想.
下面的代码中仍然有可以优化的地方,例如num数组实际上可以不需要,从而节省一些空间,但是为了直接移植以前写过的代码还是使用了.
代码
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > dp(sum,vector<int>(sum));
vector<int> num(sum);
vector<vector<int> >res;
//初始化num
for(int i=0;i<sum;i++)
{
num[i] = i+1;
}
//初始化正对角线的元素,保证dp正确进行
for(int i=0;i<sum;i++)
{
dp[i][i] = num[i];
}
for(int i=0;i<sum;i++)
{
for(int j=1;j<sum;j++)
{
if(i>=j)continue;
dp[i][j] = dp[i][j-1] + num[j];
if(dp[i][j]==sum){
vector<int> per_res;
for(int k=i;k<=j;k++)
{
per_res.push_back(num[k]);
}
res.push_back(per_res);
}
}
}
return res;
}
};