列表

详情


NC259. 和为S的连续正数序列

描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?

数据范围:
进阶:时间复杂度

输出描述

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

示例1

输入:

9

输出:

[[2,3,4],[4,5]]

示例2

输入:

0

输出:

[]

原站题解

import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

C++ 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2021-03-28

class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
//
int End=sum/2+1;
int left=1;
int right=1;
int CurSum=1;
vector<vector<int> >res;
while(left<=End&&right<=End)
{
if(CurSum==sum)
{
GetVector(res,left,right);
right++;
CurSum+=right;
}
else if(CurSum<sum)//
{
right++;
CurSum+=right;
}
else
{
CurSum-=left;
left++;
}
}
return res;
}
void GetVector(vector<vector<int> >&res,int left,int right)
{
if(left==right)
{
return ;
}
vector<int>V;
for(int i=left;i<=right;i++)
{
V.push_back(i);
}
res.push_back(V);
}
};

C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-28

class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
//
/*vector<vector<int>> ret;
int tmp = 0;
for (int i=1; i<=sum/2; ++i) { //sum/2+sum+1 sumsum/2
for (int j=i; j<sum; ++j) {
tmp += j;
if (sum == tmp) {
vector<int> ans;
for (int k=i; k<=j; ++k) ans.push_back(k);
ret.push_back(ans);
}
else if (tmp > sum) {
//
tmp = 0;
break;
}
}
}
return ret; */
//
vector<vector<int>> res;
int i=1, j=1;
int temp=0;
while(i<=sum/2){
if (temp<sum) {
temp +=j;j++;}
else if(temp>sum) {
temp -=i; i++;}
else {
vector<int> ans;
for(int k=i; k<j;k++){
ans.push_back(k);
}
res.push_back(ans);
temp -=i;
i++;
}
}
return res;
}
};

C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-13

class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
int win_l = 1, win_r = 1, win_sum = 1;
vector<vector<int> > ans;
while(win_r <= sum / 2)
{
while(win_sum < sum)
{
win_r++;
win_sum += win_r;
}
while(win_sum >= sum)
{
if(win_sum == sum)
{
ans.push_back(getvec(win_l,win_r));
}
win_sum = win_sum - win_l;
win_l++;
}
}
return ans;
}
vector<int> getvec(int l ,int r)
{
vector<int> res;
for(int i = l; i <= r; i++)
{
res.push_back(i);
}
return res;
}
};

C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-08

class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
int end=sum/2+1;//
int left=1,right=1,current=1;
vector<vector<int>>res;
while(left<=end&&right<=end)//
{
if(current==sum)
{
GetVector(res,left,right);
right++;
current+=right;
}
else if(current<sum)
{
right++;
current+=right;
}
else
{
left++;
right=left;
current=left;
}
}
return res;
}
void GetVector(vector<vector<int>>&res,int left,int right)
{
if(left>=right)//
return;
vector<int>v;
for(int i=left;i<=right;i++)
{
v.push_back(i);
}
res.push_back(v);
}
};

C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-06

class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> ans;
int temp = 0, start = 1, end = 1;
while (start <= sum / 2) {
if (temp < sum) {
temp += end;
++end;
} else if (temp > sum) {
temp -= start;
++start;
} else {
vector<int> ret;
for (int i = start; i < end; ++i) {
ret.push_back(i);
}
ans.push_back(ret);
temp -= start;
++start;
}
}
return ans;
}
};

上一题