和为 s 的连续正数序列

题目描述:

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

示例:
输入:target = 9
输出:[[2,3,4],[4,5]]

题目分析:

假若我们输入的 target 为 9,大脑中应该有下面这么个玩意:

 

 然后我们通过左右指针来维护一个滑动窗口,同时计算窗口内的值是否是目标值:

 

如果窗口的值过小,我们就移动右边界。

 

 如果窗口的值过大,我们就移动左边界。

 

 剩下的就是反复上面的操作就可以了。到这里分析过程看似结束了。但是我们可以观察出一丢丢规律,用来优化我们的算法。对于任意一个正整数,总是小于它的中值与中值+1的和。为了让大家直观,用下图举例:

 

比如这里的100,就一定小于50+51,换成其他数也一样。换句话说,一旦窗口左边界超过中值,窗口内的和一定会大于 target

代码:

func findContinuousSequence(target int) [][]int { 
    result := make([][]int, 0) 
    i := 1 
    j := 1 
    win := 0 
    arr := make([]int, target) 
    for i := range arr {
        arr[i] = i + 1
    }
    for i <= target/2 {
        if win < target {
            win += j
            j++
        } else if win > target {
            win -= i
            i++
        }  else {
            result = append(result, arr[i-1:j-1])
            win -= i
            i++
        }
    }
    return result
}

  地址:https://mp.weixin.qq.com/s/a6wyZSHro3SesVMRkzOdiQ

 

posted @ 2020-10-10 10:08  small_lei_it  阅读(85)  评论(0编辑  收藏  举报