leetcode1664 : Le nombre de schémas pour générer un tableau équilibré (1,28 une question par jour)

Énoncé de sujet :

On vous donne un tableau d'entiers nums . Vous devez sélectionner exactement un indice (les indices commencent à 0) et supprimer l'élément correspondant. Notez que les indices des éléments restants peuvent changer en raison de l'opération de suppression.

Par exemple, si nums = [6,1,7,4,1] , alors :

Sélectionnez pour supprimer l'indice 1, laissant un tableau de nombres = [6,7,4,1] .
Sélectionnez pour supprimer l'indice 2 , laissant un tableau de nums = [6,1,4,1] .
Sélectionnez pour supprimer l'indice 4 , laissant un tableau de nums = [6,1,7,4] .
Un tableau est un tableau équilibré si la somme des éléments impairs est égale à la somme des éléments pairs.

Veuillez renvoyer l'opération de suppression, les numéros de tableau restants correspondent au nombre de schémas du tableau équilibré.

Exemple 1:

Entrée : nums = [2,1,6,4]
Sortie : 1
Explication :
Supprimer l'indice 0 : [1,6,4] -> Les éléments pairs sont indicés : 1 + 4 = 5. L'indice des éléments impairs est : 6. déséquilibré.
Supprimez l'indice 1 : [2,6,4] -> l'indice de l'élément pair est : 2 + 4 = 6. L'indice des éléments impairs est : 6. équilibre.
Supprimez l'indice 2 : [2,1,4] -> l'indice de l'élément pair est : 2 + 4 = 6. Les éléments impairs sont indicés comme suit : 1. déséquilibré.
Supprimez l'indice 3 : [2,1,6] -> l'indice de l'élément pair est : 2 + 6 = 8. Les éléments impairs sont indicés comme suit : 1. déséquilibré.
Il n'y a qu'une seule façon de faire du tableau restant un tableau équilibré.
Exemple 2 :

Entrée : nums = [1,1,1]
Sortie : 3
Explication : Vous pouvez supprimer n'importe quel élément, et le tableau restant est un tableau équilibré.
Exemple 3 :

Entrée : nums = [1,2,3]
Sortie : 0
Explication : Quel que soit l'élément supprimé, le tableau restant n'est pas un tableau équilibré.
 

indice:

1 <= nums.length <= 1e5
1 <= nums[i] <= 1e4

Idées de résolution de problèmes :

        La signification exprimée dans le titre est facile à comprendre. Il s'agit de supprimer chaque élément d'indice dans le tableau pour obtenir un nouveau tableau. Si la somme des éléments d'indice pairs dans le nouveau tableau est égale à la somme des éléments impairs- éléments d'indice numérotés, alors ce schéma est un schéma équilibré. , pour calculer le nombre total de tous les schémas d'équilibrage.

        Deux méthodes : premièrement, il est plus facile de penser à une solution violente . Après avoir supprimé un élément, un nouveau tableau est obtenu, et le nouveau tableau est à nouveau additionné avec des indices pairs et des indices impairs. S'ils sont égaux, le nombre de solutions équilibrées sera +1. La complexité temporelle est O(N*N) et la longueur du tableau est de 100 000, ce qui dépasse la limite de temps.

        La seconde consiste à trouver la somme du préfixe (similaire à une fenêtre glissante) . Lorsqu'un certain élément d'indice dans le tableau est supprimé, on constatera que l'élément d'indice pair avant l'indice actuel est toujours l'élément d'indice pair du nouveau tableau , tandis que l'élément en indice courant Les éléments en indice pairs après l'élément en indice deviennent des éléments en indice impairs, et les éléments en indice impairs deviennent des éléments en indice pairs. Définissez la somme des indices pairs et impairs du préfixe comme étant 0, et la somme des éléments d'indice pair et impair du suffixe comme étant la somme des éléments d'indice pair et impair dans l'ensemble du tableau. Chaque fois que les éléments d'indice du tableau sont parcourus, la somme des éléments d'indice pair et impair du préfixe et du suffixe doit être modifiée pour obtenir tous les numéros de schéma de tableau équilibré.

Code de résolution de problèmes :

class Solution {
public:
    int waysToMakeFair(vector<int>& nums) {
        int sumFrontO=0;
        int sumBcakJ=0;
        int sumAllO=0;
        int sumAllJ=0;
        int plan=0;
        for(int i=0;i<nums.size();i++)
        {
            if(i%2==0) sumAllO+=nums[i];
            else       sumAllJ+=nums[i];
        }
        for(int i=0;i<nums.size();i++)
        {
            if(i%2==0)
            {
                sumAllO-=nums[i];
                if(sumFrontO+sumAllJ==sumAllO+sumBcakJ)
                {
                    plan++;
                }
                sumFrontO+=nums[i];
            }
            else
            {
                sumAllJ-=nums[i];
                if(sumBcakJ+sumAllO==sumFrontO+sumAllJ)
                {
                    plan++;
                }
                sumBcakJ+=nums[i];
            }
        }
        return plan;
    }
};

Je suppose que tu aimes

Origine blog.csdn.net/m0_63743577/article/details/128782535
conseillé
Classement