Pregunta 62 de la entrevista de Leetcode. El último número restante en el círculo

Descripción del problema

Los n números 0,1, n-1 están dispuestos en un círculo, comenzando con el número 0 y eliminando el número enésimo de este círculo cada vez. Encuentra el último número que queda en este círculo.

Por ejemplo, los 5 dígitos 0, 1, 2, 3 y 4 forman un círculo, y el tercer dígito se elimina cada vez del dígito 0, luego los primeros 4 dígitos eliminados son 2, 0, 4, 1, y así sucesivamente. El número restante es 3.

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

Informe de resolución de problemas.

  • El número de n persona es 0 0 , 1 , 2 , , norte 1 0,1,2, \ cdots, n-1 , elimine el número como m 1 m-1 persona, la siguiente persona eliminada de k + 1 k + 1 comienza a contar, la secuencia numérica correspondiente es m , m + 1 , , n 1 , 0 , , m 2 m, m + 1, \ cdots, n-1,0, \ cdots, m-2
  • Restante n 1 n-1 Haga un mapeo del número de persona, y mapeelo en 0 , 1 , , n 2 0,1, \ cdots, n-2 , luego en la nueva secuencia x X es la secuencia original ( x + m ) % n (x + m) \% n
  • En otras palabras n 1 n-1 persona el último número restante es x X , entonces correspondiente n norte El número de la última persona restante de personas es ( x + m ) % n (x + m) \% n
  • Hacer f ( n ) f (n) significa n norte número de la última persona que queda, luego f ( n ) = ( f ( n ) + m ) % n f (n) = (f (n) + m) \% n

Código de implementación

  • Recursivo
class Solution {
	public:
		int f(int n, int m) {
	        if (n == 1)
	            return 0;
	        int x = f(n - 1, m);
	        return (m + x) % n;
	    }
    	int lastRemaining(int n, int m) {
        	return f(n, m);
    	}
};
  • Iterar
class Solution {
public:
    int lastRemaining(int n, int m) {
        int ans=0;
        for(int i=2;i<=n;i++){
            ans=(ans+m)%i;
        }
        return ans;
    }
};
Publicado 139 artículos originales · elogiado 8 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_27690765/article/details/105210599
Recomendado
Clasificación