タイトル
输入一个正整数 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は、加算式に従って、対象配列の開始位置と終了位置です。
=合計、加算間隔の結果を分析する[L、R]のために
- 質問の意味は、初期状態ではL = 1、R = 2(少なくとも2つの数の配列、及び正の整数の連続した配列)であります
- [L、R]は対象番組シーケンスを見つけるために、間隔と目標値と等しい場合、新しい間隔値は、シーケンスの結果であり、右の開始位置が変更され、
- 場合[L、R&LT]時間間隔と目標値よりも大きい場合、その値は、間隔が大きすぎることを示し、すなわち、配列を修飾せず開始位置として現在位置は、lが正しいものである、トラバースを続行
- [L、R]は短い時間間隔と目標値よりも、その値はR&LT右、間隔が小さすぎることを示す、横断続ける場合
- 繰り返し[L、R]およびそれに続くセクションは、少なくとも二つの配列を有するL> = R、すなわちまで2-4ステップ条件数満たしていない(R - L + 1)> = 2 条件、トラバースの端
- リターンリザルトRES
- また、理由は次のとおりです。
=
=
したがって、除算演算を合計各トラバース加算式を低減することを可能にするトラバース目標* 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
}