Sword se refiere a la serie Offer Sword se refiere a la Oferta 62: el último número restante en el círculo; combate el problema del anillo de Joseph nuevamente

Descripción del Título:

Los n números de 0, 1 y n-1 se organizan en un círculo, comenzando por el número 0 y eliminando el número m de este círculo cada vez. Encuentra el último número que queda en el círculo.

Por ejemplo, los 5 números 0, 1, 2, 3 y 4 forman un círculo. Cada vez que se elimina el tercer número del número 0, los primeros 4 números que se eliminarán son 2, 0, 4 y 1, por lo que al final El número restante es 3.

Ejemplo 1:

Entrada: n = 5, m = 3
 Salida:  3

Ejemplo 2:

Entrada: n = 10, m = 17
 Salida:  2

Ideas de resolución de problemas:

Resultados revertidos de acuerdo con la ley (imágenes robadas de leetcode):

Primero, debe comprender el proceso de la imagen de arriba. Es decir, la posición de los más seguros en cada ciclo.

Entonces, ¿comprende la posición en movimiento del número eliminado (clave)?

  1. Se puede extraer de la figura: después de eliminar un número, toda la cadena de números se dividirá en dos partes, estas últimas se colocarán al frente ( moviendo tres dígitos hacia la izquierda ) y el complemento al frente está en la parte posterior,
    si se elimina en este momento Un número, que se vuelve a agregar al final, es solo la matriz original, pero la posición de las dos partes ha cambiado.
  2. Entonces, si se le da una secuencia en este momento, ¿puede revertir la secuencia anterior?
    Es decir, si hace un dígito al final, y luego toda la secuencia se mueve tres lugares a la derecha , los siguientes dígitos se desbordarán , entonces nuevamente Divida la duración del tiempo anterior. Entonces aquellos que se desbordaron regresarán y restaurarán como eran antes de la eliminación.
  3. Entonces, ¿qué sucede cuando lo lleva a una determinada posición, su última posición no es "(esta posición + duración del intervalo)% duración de la última vez" es la última posición.
    Es decir, la posición se mueve tres lugares hacia la derecha esta vez. Si no hay desbordamiento, significa que la última vez está atrás. Si se desborda, significa que la última vez estuvo en el frente. Luego, después de la última eliminación , se movió hacia atrás, así que divida por la longitud para volver a la posición original.

A partir de esto, se obtiene el proceso de verificación de la deducción inversa:

  • El proceso de 1-> 2: la posición de (0 + 3)% 2 = 1
  • El proceso de 2-> 3, es decir, la posición de (1 + 3)% 3 = 1
  • El proceso de 3-> 4, es decir, la posición de (1 + 3)% 4 = 0

Entonces este código es muy simple, pero es un poco difícil de entender.

Código:

class Solution {
public:
    int lastRemaining(int n, int m) {
        int q=0;
        for(int i=2;i<=n;i++)
        {
            q=(q+m)%i;
        }
        return q;
    }
};

 

Supongo que te gusta

Origin blog.csdn.net/qq_46423166/article/details/110817226
Recomendado
Clasificación