[Título] algoritmo y número de secuencia positiva continua s (resolución de Go)

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: ( un + si ) * ( si - un + 1 ) 2 {(A + b) * (b - a + 1)} \ over {2} = Sum, para [l, r] Analizando los resultados de la suma intervalo

  1. 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)
  2. 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,
  3. 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
  4. 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
  5. 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
  6. devolución de resultado de res
  • Además, debido a que:
    ( un + si ) * ( si - un + 1 ) 2 {(A + b) * (b - a + 1)} \ over {2} = s u m suma
    =
    ( a + b ) ( b a + 1 ) = s u m 2 {(A + b) * (b - a + 1)} = suma * 2
    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
}
Publicado 18 artículos originales · ganado elogios 8 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_20408397/article/details/104692989
Recomendado
Clasificación