Description du titre:
Les n nombres de 0, 1 et n-1 sont disposés dans un cercle, en commençant par le nombre 0, et en supprimant à chaque fois le m-ième nombre de ce cercle. Trouvez le dernier numéro restant dans le cercle.
Par exemple, les 5 chiffres 0, 1, 2, 3 et 4 forment un cercle. Chaque fois que le troisième chiffre est supprimé du chiffre 0, les 4 premiers chiffres à supprimer sont 2, 0, 4 et 1, donc à la fin Le nombre restant est 3.
Exemple 1:
Entrée: n = 5, m = 3 Sortie: 3
Exemple 2:
Entrée: n = 10, m = 17 Sortie: 2
Idées de résolution de problèmes:
Résultats inversés selon la loi (images volées sur leetcode):
Tout d'abord, vous devez comprendre le processus de l'image ci-dessus. Autrement dit, la position du plus sûr à chaque cycle.
Alors, comprenez-vous la position de déplacement du numéro supprimé (clé)
- Il peut être dessiné à partir de la figure: après avoir supprimé un nombre, toute la chaîne de nombres sera divisée en deux parties, ces dernières sont placées à l'avant (en déplaçant trois chiffres vers la gauche ), et le complément avant est à l'arrière,
s'il est supprimé à ce moment Un nombre, rajouté à la fin, n'est que le tableau d'origine, mais la position des deux parties a changé. - Donc, si vous recevez une séquence à ce moment, pouvez-vous inverser la séquence précédente,
c'est-à-dire que si vous composez un chiffre à la fin, puis que toute la séquence se déplace de trois places vers la droite , les prochains chiffres déborderont , donc encore Divisez la longueur de la fois précédente. Ensuite, ceux qui ont débordé reviendront et restaureront ce qu'ils étaient avant la suppression. - Donc, que se passe-t-il lorsque vous l'amenez à une certaine position, sa dernière position n'est pas "(cette position + longueur de l'intervalle)% dernière durée" est la dernière position.
Autrement dit, la position est déplacée de trois places vers la droite cette fois. S'il n'y a pas de dépassement, cela signifie que la dernière fois est en retard. Si elle déborde, cela signifie que la dernière fois était à l'avant. Puis après la dernière suppression , il s'est déplacé vers l'arrière, donc divisez par la longueur pour revenir à la position d'origine.
À partir de là, la vérification du processus de la déduction inverse est obtenue:
- Le processus de 1-> 2: la position de (0 + 3)% 2 = 1
- Le processus de 2-> 3, c'est-à-dire la position de (1 + 3)% 3 = 1
- Le processus de 3-> 4, c'est-à-dire la position de (1 + 3)% 4 = 0
Donc ce code est très simple, mais il est un peu difficile à comprendre.
Code:
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;
}
};