[Diario de preguntas de pincel] 307. Área y recuperación: la matriz se puede modificar

¡Acostúmbrate a escribir juntos! Este es el cuarto día de mi participación en el "Nuevo plan diario de los Nuggets·Desafío de actualización de abril", haz clic para ver los detalles del evento .

[Diario de preguntas de pincel] 307. Área y recuperación: la matriz se puede modificar

El artículo 24 de este diario de cepillado se titula: 307. Región y recuperación: matriz modificable , medio

1. Descripción del tema:

En el segundo día de las vacaciones de Qingming, sigamos respondiendo a la pregunta del código lelet del día.

Como me siento cuando veo esta pregunta, mi primera sensacion es que quiza se me acorte el tiempo de salir a jugar, eh, son platos

Esta pregunta puede no ser igual a otras preguntas. Esta es una función pequeña, no solo una función , pero está bien, aún podemos resolverla, analicémosla juntos.

2. ¿Qué idea examina esta pregunta? ¿Cuál es tu pensamiento?

Echemos un vistazo más de cerca a esta pregunta y demos qué información clave:

  • Las condiciones conocidas dadas por el título, los operandos específicos y las matrices específicas tienen dos requisitos para nosotros. El primero es modificar el valor en la posición de índice especificada al valor deseado a través de la actualización, y el segundo es dar los intervalos izquierdo y derecho. ., podemos consultar rápidamente su intervalo y
  • Después de leer esta pregunta, debemos hacer lo siguiente:
    • Completa la definición de NumArray
    • Manejo de constructores
    • Implementación de la función Actualizar
    • Implementación de la función SumRange

Para aquellos de nosotros que no tenemos experiencia en escribir este tipo de preguntas, si lo pensamos un poco, podemos escribir un código que puede calcular el resultado esperado. Esa es la práctica normal, atravesar la matriz y acumular

Algo como esto:

¿Quieres decir lo que está mal con este código?

Dice que hay un problema, de hecho, él también resolvió algunos problemas, dice que no hay problema, de hecho, cuando la cantidad de datos en el caso de uso es grande, se agotará el tiempo y no hay forma de AC

Entonces tenemos que considerar otras formas, pensar en ello y usar temporalmente un método simple para calcular la suma del intervalo.

Podemos usar la agrupación segmentada para tratar con

Aquí usamos un ejemplo para deducir cómo calcular la suma del intervalo.Para la función de actualización, esto no se explicará demasiado.

Por ejemplo, podemos personalizar un ejemplo, la matriz correspondiente es [1, 3, 4, 5, 7, 8, 9], luego veamos la imagen

De acuerdo con el ejemplo anterior, xdm también puede personalizar un ejemplo para deducirlo, y se puede entender rápidamente.

3. Codificación

De acuerdo con la lógica y el análisis anteriores, podemos traducirlo al siguiente código, aquí debemos prestar atención a la clasificación de SumRange

La codificación es la siguiente:

type NumArray struct {
    nums ,sums[]int
    size int

}

func Constructor(nums []int) NumArray {
    length := len(nums)
    size :=int(math.Sqrt(float64(length))) 
    // 定义个记录每一块区间和的切片,大小为
    sums := make([]int,(length / size)+1)

    for i,n := range nums{
        // 对于每一个区间求和
        sums[i/size] += n
    }

    return NumArray{nums,sums,size}
}


func (this *NumArray) Update(index int, val int)  {
    // 处理该值所在区间的数字
    this.sums[index/this.size] += val - this.nums[index]
    this.nums[index] = val
}


func (this *NumArray) SumRange(left int, right int) (ans int) {

    a := left/this.size
    b := right/this.size

    // 说明 left 和 right 对应的区间是同一块
    if a == b{
        for i:=left;i<=right;i++ {
         ans += this.nums[i]
        }
        return
    }

    // left 和 right 不是同一块,至少是 2 块以上的情况
   
    // 处理  left 到 所在块的内容
    for i := left ; i<(a+1)*this.size;i++{
         ans += this.nums[i]
    }
    // 处理left 下一块到 right 所在块的内容,此处正好可以使用 sum 数组中的内容
    for i :=a+1;i<b;i++{
         ans += this.sums[i]
    }
    // 处理 right 所在块的起点,到 right 的内容
    for i:=b*this.size;i<= right ;i++ {
        ans += this.nums[i]
    }

    return
}

复制代码

4. Resumen:

La complejidad temporal de este problema debe distinguirse según la función

  • La complejidad del tiempo del constructor es O(n),
  • la complejidad del tiempo de actualización es O(1)
  • La complejidad de tiempo de SumRange es O (raíz n)

En términos de complejidad espacial, hemos introducido una matriz de sumas y la longitud de nuestra matriz de sumas depende del número de copias de la matriz que cortamos, por lo que es O (número de raíz n)

Dirección del título original: 307. Área y recuperación: la matriz se puede modificar

Estoy aquí hoy, lo que he aprendido, si hay alguna desviación, corríjame

Bienvenido a me gusta, seguir, favorito

Amigos, su apoyo y aliento son la motivación para que yo persista en compartir y mejorar la calidad.

Bien, aquí está esta vez.

La tecnología es abierta, y nuestra mentalidad debe ser abierta. Acepta el cambio, vive bajo el sol y sigue adelante.

Soy el pequeño demonio Nezha , bienvenido a dar me gusta, seguir y coleccionar, hasta la próxima ~

Supongo que te gusta

Origin juejin.im/post/7082713303356538916
Recomendado
Clasificación