• 和为 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

  • 相关阅读:
    图形合并
    启动脚本
    图形合并
    :(){:|:&};:
    C言语教程第八章:列举,位运算(5)
    C言语图形情势编程,赋性鼠标(4)
    C言语教程第十章:文件(6)
    C言语教程第十章:文件(4)
    红帽为什么要连结桌面Linux
    阶乘较劲争论器改善版
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13790473.html
Copyright © 2020-2023  润新知