JZ41 和为S的连续正数序列
题目:计算有多少种连续的正数序列的和为100(至少包含两个数,输出要求序列内从小到大的顺序,序列间按照从小到大的顺序)
两个指针l、r指向区间首和区间尾,公式(l+r)∗(r−l+1)/2计算区间内部的序列和,如果这个和刚好等于目标数,说明以该区间首开始的序列找到了,记录下区间内的序列,同时以左边开始的起点就没有序列了,于是左区间收缩;如果区间和大于目标数,说明该区间过长需要收缩,只能收缩左边;如果该区间和小于目标数,说明该区间过短需要扩大,只能向右扩大,移动区间尾。
具体做法:
- step 1:从区间[1,2][1,2]开始找连续子序列。
- step 2:每次用公式计算区间内的和,若是等于目标数,则记录下该区间的所有数字,为一种序列,同时左区间指针向右。
- step 3:若是区间内的序列和小于目标数,只能右区间扩展,若是区间内的序列和大于目标数,只能左区间收缩。
func FindContinuousSequence( sum int ) [][]int { // write code here res := make([][]int, 0) if sum <= 2 { return res } start, end := 1, 2 for start < end { total := (end + start) * (end - start + 1) / 2 if total == sum { sequence := make([]int, 0) for i := start; i <= end; i++ { sequence = append(sequence, i) } res = append(res, sequence) start++ } else if total < sum { end++ } else { start++ } } return res }