L'épée fait référence à l'offre — 62. Jeu pour enfants (le dernier numéro restant dans le cercle) —Analyse et code (Java)

@ toc

1. Titre

Chaque 1er juin, Journée des enfants, Niuke préparera des petits cadeaux pour rendre visite aux enfants de l'orphelinat, et cela est également vrai cette année. En tant que vétéran senior de Niu Ke, HF a naturellement préparé quelques petits jeux. Parmi eux, il y a un jeu comme celui-ci: d'abord, laissez les enfants former un grand cercle. Ensuite, il a désigné au hasard un nombre m, et a laissé l'enfant numéro 0 commencer à rapporter. Chaque fois que l'enfant qui crie m-1 doit sortir pour chanter une chanson, puis il peut choisir n'importe quel cadeau dans le coffret cadeau, et il ne revient plus dans le cercle. À partir de son prochain enfant, continuez 0… m -1 Signalez le nombre ... Continuez ... jusqu'à ce que le dernier enfant soit laissé, vous n'avez pas besoin de jouer, et vous pouvez obtenir la précieuse édition Collector "Detective Conan" (le quota est limité !! _ ). Essayez de réfléchir, quel enfant recevra ce cadeau? (Remarque: les nombres d'enfants vont de 0 à n-1)

S'il n'y a pas d'enfants, veuillez renvoyer -1.

Deux, analyse et code

1. Simulation de liste liée à l'anneau

(1) Penser

La méthode la plus simple consiste à simuler le cercle dans une liste chaînée circulaire. À ce stade, la complexité temporelle est O (mn) et la complexité spatiale est O (n).

(2) Code

public class Solution {
    
    
    public int LastRemaining_Solution(int n, int m) {
    
    
        if (n < 1)
            return -1;
        if (n == 1)
            return 0;
        
        ListNode head = new ListNode(0);
        ListNode pre = head;
        ListNode node = null;
        for (int i = 1; i < n; i++) {
    
    
            node = new ListNode(i);
            pre.next = node;
            pre = node;
        }
        node.next = head;
        
        while (node.next != node) {
    
    
            for (int i = 0; i < m - 1; i++)
                node = node.next;
            node.next = node.next.next;
        }
        
        return node.val;
    }
}

class ListNode {
    
    
    int val;
    ListNode next = null;

    ListNode(int val) {
    
    
        this.val = val;
    }
}

(3. Résultats

Durée de fonctionnement: 28ms, mémoire occupée: 9420k.

2. Formule de récurrence

Tout d'abord, induisez mathématiquement la formule de récurrence des nombres restants. Pour le processus spécifique, veuillez vous référer au livre "Sword Finger Offer". La formule obtenue est:

f(n,m)=0, n=1  
f(n,m)=[f(n-1,m)+m]%n, n>1  

Combiné avec la formule récursive, le résultat peut être rapidement calculé par récursion ou boucle.

(2) Code

public class Solution {
    
    
    public int LastRemaining_Solution(int n, int m) {
    
    
        if (n < 1)
            return -1;
        int num = 0;
        for (int i = 2; i <= n; i++)
            num = (num + m) % i;
        return num;
    }
}

(3. Résultats

Durée de fonctionnement: 18ms, mémoire occupée: 9204k.

Trois, autre

Rien.

Je suppose que tu aimes

Origine blog.csdn.net/zml66666/article/details/112155771
conseillé
Classement