和为 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
    small_lei_it  技术无止境,追求更高。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号