剑指offer57. 连续数组中和为s的数字 P280
-
一个递增序列中,找出任意两个数和为s (两点法,前后同时走)P280
-
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)P282
如: 输入s=15 1+2+3+4+5=4+5+6=7+8= 15
// 还是两点法,small指向最小的,big指向最大的,只不过两个同方向运动 ,sum存两者之间的所有数字和, small前进时sum是减少的,big前进,sum是增加的
void FindContinuousSequence(int num) {
if (num < 2)
return;
int small = 1, big = 2; // 左右指针初始值
int sum = 3; // small 到 big的和
while (small <= (num + 1) / 2) { // sum=num时前进的是small,所以最好用small比较
if (sum == num) {
for (int i = small; i <= big; ++i) { // 打印
printf("%d ",i);
}
printf("\n");
sum -= small; // small前进sum是减少的
++small; // 要前进,不然死循环
}else if (sum < num) { // sum小,前进大指针big
++big;
sum += big;
}else {
sum -= small;
++small; // sum 比给定num大,small前进
}
}
}