[タイトル]アルゴリズムと連続正の数のシーケンスs(ゴー解決)

タイトル

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

 
示例 1:

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

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
 

限制:

1 <= target <= 10^5

题目来源:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/

崩壊アイデア:
二つのポインタLを確立し、Rは、加算式に従って、対象配列の開始位置と終了位置です。 A + B * B - A + 1 2 {(+ b)は*(B - + 1)} \ {2}上 =合計、加算間隔の結果を分析する[L、R]のために

  1. 質問の意味は、初期状態ではL = 1、R = 2(少なくとも2つの数の配列、及び正の整数の連続した配列)であります
  2. [L、R]は対象番組シーケンスを見つけるために、間隔と目標値と等しい場合、新しい間隔値は、シーケンスの結果であり、右の開始位置が変更され、
  3. 場合[L、R&LT]時間間隔と目標値よりも大きい場合、その値は、間隔が大きすぎることを示し、すなわち、配列を修飾せず開始位置として現在位置は、lが正しいものである、トラバースを続行
  4. [L、R]は短い時間間隔と目標値よりも、その値はR&LT右、間隔が小さすぎることを示す、横断続ける場合
  5. 繰り返し[L、R]およびそれに続くセクションは、少なくとも二つの配列を有するL> = R、すなわちまで2-4ステップ条件数満たしていない(R - L + 1)> = 2 条件、トラバースの端
  6. リターンリザルトRES
  • また、理由は次のとおりです。
    A + B * B - A + 1 2 {(+ b)は*(B - + 1)} \ {2}上 = s u m
    =
    ( a + b ) ( b a + 1 ) = s u m 2 {(+ b)は*(B - + 1)} =合計* 2
    したがって、除算演算を合計各トラバース加算式を低減することを可能にするトラバース目標* 2を行うことができるだけでなく、回避結果/ 2の決意は、非整数の結果と各キャストにすることができます操作のint型は、特定の効率を向上させます。

コードを行きます

//双指针法
func findContinuousSequence(target int) [][]int {
    if target < 3 {
        return [][]int{}
    }

    var res [][]int
    l := 1
    r := 2
    target = target << 1 //这里用位移预算代替*号运算,左移1位,将target * 2
    for l < r {
        sum := (l + r) * (r - l + 1) //减少了每次求和除法运算,也避免了/2带来的结果可能为非整数而每次将结果强制转换为int型的操作
        if sum == target {
            subRes := make([]int, r - l + 1)
            k := 0
            for j := l; j <= r; j++ {
                subRes[k] = j
                k++
            }
            res = append(res, subRes)
            l++
        } else if sum < target {
            r++
        } else {
            l++
        }
    }
    return res
}
公開された18元の記事 ウォンの賞賛8 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_20408397/article/details/104692989