L'épée fait référence à la série d'offres L'épée fait référence à l'offre 62: le dernier numéro restant dans le cercle; combat à nouveau le problème de l'anneau Joseph

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é)

  1. 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é.
  2. 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.
  3. 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;
    }
};

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_46423166/article/details/110817226
conseillé
Classement