题目描述:
输入一个正整数 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