título
输入一个正整数 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/
las ideas de desintegración:
el establecimiento de dos punteros l, r son la posición de comienzo de secuencia elegibles y la posición final, de acuerdo con la fórmula sumatoria:
= Sum, para [l, r] Analizando los resultados de la suma intervalo
- El significado de las preguntas, el estado inicial es l = 1, r = 2 (secuencia de al menos dos números, y una secuencia continua de números enteros positivos)
- Cuando [l, r] es igual al intervalo y el valor objetivo, para encontrar una secuencia de espectáculo elegibles, el nuevo valor de intervalo es el resultado de una secuencia, y la derecha va a cambiar la posición de partida,
- Cuando [l, R & lt] es mayor que el intervalo de tiempo y el valor objetivo y el valor indica que el intervalo es demasiado grande, es decir, la posición actual como una posición de partida sin calificar secuencia, l es la correcta, continúe de desplazamiento
- Cuando [l, r] es menor que el intervalo de tiempo y el valor objetivo y el valor indica que el intervalo es demasiado pequeño, un R & lt derecha, continuar de desplazamiento
- Repetir los pasos 2-4 hasta l> = r, es decir, [l, r] y secciones subsiguientes tiene secuencia de al menos dos no cumple con el número de condición (r - l + 1)> = 2 condición, el final de recorrido
- devolución de resultado de res
- Además, debido a que:
=
=
Por lo tanto, la determinación se puede realizar de destino de recorrido de * 2, que permite reducir cada fórmula traverse suma sumando operaciones de división, sino también para evitar resultados / 2 pueden ser llevados a un resultado no entero y cada molde tipo int de operación, mejorar la eficiencia de seguro.
códigos IR
//双指针法
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
}