package com.wsy.sword;
import java.util.ArrayList;
public class FindContinuousSequence
{
/*
* 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。
*没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
*输出描述:
*输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
*
*思路:使用双指针,相当于有一个窗口,窗口的左右两边就是两个指针
*/
public ArrayList<ArrayList<Integer>> findContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
int left = 1; // 左指针
int right = 2; // 右指针
while(left < right && right <= (sum >> 1) + 1){
//等差序列求和n(a1 + an)/2
int sub = (left + right)*(right-left+1)/2;
//子序列和为sum则将窗口范围的所有数添加到结果集
if(sub == sum){
ArrayList<Integer> subList = new ArrayList<Integer>();
for (int i = left; i <= right; i++){
subList.add(i);
}
result.add(subList);
left++;
}else if(sub < sum){ //子序列和小于sum则移动右指针
right++;
}else{
left++; //子序列和大于sum说明此序列一不满足条件则移动左指针
}
}
return result;
}
public static void main(String[] args){
FindContinuousSequence f = new FindContinuousSequence();
System.out.println(f.findContinuousSequence(3));
}
}
和为S的连续正数序列
最新推荐文章于 2022-05-05 11:05:49 发布