连续子序列和为s的数字
为了能够得到线性时间复杂度的算法,可以考虑两个标记,一个指向头部,一个指向尾部
1. 和大了就++head
2. 和小了就–tail
class Solution { //和为sum的两个数字,因为这是个有序的序列,自然需要利用
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
lex 实现原理std::vector<int> ret;
if(array.size()==0)
return ret;
int phead=0;
int ptail=array.size()-1;
while(phead!=ptail){
int tmpsum=array[phead]+array[ptail];
if(tmpsum==sum){
ret={array[phead],array[ptail]};
break;
}
else if(tmpsum>sum)
ptail--;
else
phead++;
}
return ret;
}
};
寻找连续序列和为sum的序列
借鉴上面的思路,考虑一个标记small指向1,一个标记big指向2
1. small和big之间的和大于sum,++small;
2. small和big之间的和小于sum,++big;
3. 等于,则记录这个序列,++small继续查找
class Solution { //连续子序列的和,一样保证一个连续的区间,移动最小的和最大的进行移动,求得所有的。
public:
vector<vector<int> > FindContinuousSequence(int sum) {
int small=1;
int big=2;
int middle=(sum+1)/2;
int tmpsum=small+big;
std::vector<vector<int>> ret;
while(small<middle){
if(tmpsum==sum){
std::vector<int> v;
for(int i=small;i<=big;i++)
v.push_back(i);
ret.push_back(v);
tmpsum-=small++;
}
else if(tmpsum>sum){
tmpsum-=small++;
}
else{
tmpsum+=++big;
}
}
return ret;
}
};