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
}

浙公网安备 33010602011771号