输出所有和为S的连续正数序列
程序员文章站
2022-07-15 12:25:22
...
输出所有和为S的连续正数序列。
序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
至少包括两个数
思路: 可以使用滑动窗口的思想
定义快慢2个指针
由于是连续的几个数 求和使用等差数列 Sn = (a1 + an )* n /2
如果和等于sum 那么把这几个数存放到集合中 否则 进行判断
如果比sum小 那么将快指针进行向前移动
如果比sum大 那么将慢指针进行向前移动
import java.util.ArrayList;
import java.util.Scanner;
/**输出所有和为S的连续正数序列。至少包括两个数
* 序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
* @author yezhiming
*2019年9月27日
*@version
*/
public class Solution_1 {
public static void main(String[] args) {
Solution_1 solution_1 = new Solution_1();
System.out.println("输入要计算的和");
Scanner scanner = new Scanner(System.in);
int sum = scanner.nextInt();
ArrayList<ArrayList<Integer>> findContinuousSequence = solution_1.FindContinuousSequence(sum);
for (ArrayList<Integer> arrayList : findContinuousSequence) {
System.out.println(arrayList.toString());
}
}
/** 使用滑动窗口
* @param sum
* @return
*/
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = null;
//慢指针
int first = 1;
//快指针
int last = 2;
int total = 0;
while (last > first) {
//等差数列求和 sum=n(a1+an)/2
total = (first + last) * (last - first +1)/2;
if (total == sum ) {
list = new ArrayList<Integer>();
for (int j = first; j <= last; j++) {
list.add(j);
}
lists.add(list);
first++;
}else if(total < sum){
last++;
}else {
first++;
}
}
return lists;
}
}