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