Descripción del problema
0,1, n-1, que están dispuestos en un círculo números n, comenzando desde el número 0, elimine el m-ésimo dígitos, cada vez desde el interior del círculo. Encuentra el círculo en el que el último dígito restante.
El título proviene del leetcode, haga clic para entrar
Leer título
Por ejemplo, 0,1,2,3,4 cinco números en un círculo, cada deleción de tres números empezando por el número 0, los cuatro primeros dígitos de la secuencia suprimida es 2,0,4,1, por lo que la final el número restante es 3.
Una solución
solución más intuitiva
public int lastRemaining(int n, int m) {
LinkedList<Integer> list = new LinkedList<>();
// 全部加进去
for (int i = 0; i < n; i++) {
list.add(i);
}
// 只要链表长度不为 1,就不断循环
while (list.size() != 1) {
for (int i = 0; i < m; i++) {
// 取出第一个元素并删除
Integer pre = list.pollFirst();
if (i != m - 1) {
// 如果不是第m个,就加到末尾
list.add(pre);
}
}
}
return list.pollFirst();
}
solución de dos
En primer lugar, establecer los valores de m bits n eliminan de forma continua, el valor resultante de f(n,m)
la primera suprimido digital se (m-1)%n
denota x
entonces el restante n-1 se convierte en un digital (supone aquí que n es mayor que 2)
0 | 1 | ... | x-1 | x + 1 | ... | n-1 |
---|
Debido a la necesidad de un recuento después se elimina el número, primero en X + 1, los nuevos números están dispuestos en el orden
La matriz original | Correspondiente a la posición ordinal |
---|---|
x + 1 | 0 |
x + 2 | 1 |
... | ... |
n-1 | nx-2 |
0 | nx-1 |
... | ... |
x-1 | n-2 |
¿Por qué posición 0 corresponde a nx-1?
El primer paso cuando hemos borrado un número que puede ser entendido como esta lista se divide en dos partes, la
longitud de la primera parte de x (porque es a partir de 0),
entonces la longitud de la segunda parte de la misma es n-x-1
ahora la primera parte del mosaico detrás de la segunda parte,
entonces el primer número de la primera división, es decir 0, se convierte en una n-x-1+1
, es decir, los números de nx digital, ya que es a partir de cero, de modo que los correspondientes n-x-1
puntos clave:
Supongamos la secuencia correspondiente a la posición a, el valor original de B
a continuación, las posiciones secuenciales de relación una y valores B, podemos sacar la fórmula:
B = (A+x+1) mod n
Puede ser obtenido a partir de la definición inicial:
. N-ésimo dígito de 1-m-ésimo eliminar continuamente el último valor obtenido f(n-1,m)
de la ecuación anterior que puede ser empujado de nuevo a su valor inverso (f(n-1,m)+x+1)%n
del valor definido al principio es que f(n-1,m)
estaremos x=(m-1)%n
sustituido en simplificado disponibles :
f(n,m)=(f(n−1,m)+m) mod n,且f(1,m) = 0
la implementación del código
public static int lastRemaining(int n, int m) {
return n == 1 ? 0 : (lastRemaining(n-1,m) + m) % n;
}
o
public int lastRemaining(int n, int m) {
int flag = 0;
for (int i = 2; i <= n; i++) {
flag = (flag + m) % i;
}
return flag;
}