JZ41 和为S的连续正数序列

和为S的连续正数序列

题目:计算有多少种连续的正数序列的和为100(至少包含两个数,输出要求序列内从小到大的顺序,序列间按照从小到大的顺序)

两个指针l、r指向区间首和区间尾,公式(l+r)(rl+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

}

  

posted @ 2021-04-10 16:18  zqlucky  阅读(60)  评论(0编辑  收藏  举报