题目描述:输入一个sum,输出所有和为sum的连续序列,如输入9,输出[ [2,3,4[,[4,5] ],从小到大排序,
思路1:暴力两层循环
1、迭代器存储最后答案,迭代器元素,是一个个长度不同的迭代器,C++中两层迭代器时,[ ]外层不好使,直接更新内层迭代器之后,用push_back()插入就好 vec.emplace_back()
2、if else if 时< 和<= 分开写和一起写的区别
代码:
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>>ret; // 用一个迭代器装要返回的东西
vector<int>vec; //迭代器元素是一个数组
int sum=0; //判定一个数组的和,与target相比较
int halftar=target/2; //
for(int i=1;i<=halftar;i++) //暴力遍历
{
sum=i;
vec.clear(); //每次都d把内层数组清空
vec.push_back(i);
for(int j=i+1;j<=halftar+1;j++)
{
sum+=j;
if(sum<target) // 1 1和2不能写在一起
{
vec.push_back(j);
}
else if(sum==target) //2 2和1不能写在一起,一定要分开写
{
vec.push_back(j);
break;
}
else
break;
}
if(sum==target) //如果是所求数组,就把此数组添加到迭代器中
ret.push_back(vec);
}
return ret;
}
};
思路2:
滑动窗口
1、窗口左闭右开
< > = if else if 里边分别都更新和,调整窗口
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>>ret; // 用一个迭代器装要返回的东西
vector<int>vec; //迭代器元素是一个数组
int sum=0; //判定一个数组的和,与target相比较
int i=1;
int j=1;
while(i<=target/2)
{
if(sum<target) //所求小于目标,y左边界往右划
{
sum+=j;
j++;
}
else if(sum>target) // 所求大于目标,右边界右划
{
sum-=i;
i++;
}
else
{
for(int k=i;k<j;k++) //相等赋值,
{
vec.push_back(k);
}
ret.push_back(vec);
vec.clear();
sum-=i;
i+=1; //左边界右划
//sum-=i; //左边界可以一次划两下,
//sum-=(i+1); //因为相等的情况下y画一下不可能再相等
//i+=2;
}
}
return ret;
}
};