写在前面:
这个问题的基本思路是,定义两个指针,指针small指向序列的最小值,big指向序列的最大值。设置一个初始值current=small+big。
(1)当current<sum的时候,我们要增加big的值。
(2)当current>sum的时候,我们要增加small的值。
注意:最外层循环while的条件是small值的大小,由于至少为两个值,所以small<(sum+1)/2
代码实现:
package test7;
import java.util.ArrayList;
public class Solution2 {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
// 定义两个指针
int small = 1;
int big = 2;
int current = small + big;
// 因为至少有两个数,所以small要小于sum/2
int mid = (sum + 1) / 2;
// while的循环条件是small要小于sum/2
while (small < mid) {
while (current > sum && small < mid) {
current = current - small;
small++;
}
if (current == sum) {
// 将序列保存到一个新的list集合中,并将这个list保存到listAll集合中
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = small; i <= big; i++) {
list.add(i);
}
listAll.add(list);
}
// 如果小于sum
big++;
current = current + big;
}
return listAll;
}
}
总结:
此外,这道题还有变形《和为S的两个数字》,我会在后面的文章中为大家总结。